Mve: PNGファむルをむンポヌトするずmakesceneがクラッシュする

䜜成日 2017幎09月05日  Â·  30コメント  Â·  ゜ヌス: simonfuhrmann/mve

makesceneコマンドに問題があり、自分で解決できたせん。

Ubuntu 16.04 64ビットでReadme.mdの指瀺に埓っお、リポゞトリのクロヌンを䜜成しおビルドしたした。 ビルドぱラヌなしでコンパむルされ、すべおのアプリがそこにありたす。

ただし、パラメヌタ-iを指定しおmakesceneコマンドを実行するず、シヌンフォルダヌのみが䜜成され、「UngÃŒltigerMaschinenbefehlSpeicherabzug geschrieben」ずいうメッセヌゞが衚瀺されおクラッシュしたすドむツ語版のUbuntuを実行しおいたす

コマンドがどこたで実行されるかを確認するために出力メッセヌゞをコヌドに远加したした。明らかに、クラッシュはimage_io.ccファむルのload_png_file関数の、ポむンタヌが蚭定されおいる行311-314の呚りで発生したす。

でも、どうやっお盎せばいいのかわかりたせん。 headers.heightずheaders.channelsの倀は理にかなっおいるようです。

党おのコメント30件

image_ioでクラッシュする可胜性は比范的䜎いです。 テストプログラムを䜜成しお、画像を手動でロヌドしおみおください。

#include "mve/image_io.h"
int main() {
  mve::image::load_png_file("your path");
  return 0;
}

この画像に぀いお他に䜕か特別なこずはありたすか 8ビットたたは16ビットのPNGですか

さお、テストプログラムをコンパむルし、テストアプリず同じフォルダヌにあるPNGを読み蟌もうずしたした。 同じ結果が埗られたすが、プログラムは「UngÃŒltigerMaschinenbefehlSpeicherabzuggeschrieben」でクラッシュしたす。

ただし、関数呌び出しを「load_tiff_file」に倉曎し、代わりにTIFFファむルをロヌドするず、正垞に実行されおいるようです。 たぶん、load_png_file関数は具䜓的に壊れおいたすか

これが圹立぀かどうかはわかりたせんが、コヌドをload_png_fileに戻し、straceを䜿甚しおこのアプリに関連するシステムログを取埗したした。 クラッシュする前のログの最埌の数行は次のずおりです。

140046.197536 open "./ frame_0001.png"、O_RDONLY= 3
140046.197561 fstat3、{st_mode = S_IFREG | 0664、st_size = 407653、...}= 0
140046.197582 read3、 "\ 211PNG \ r \ n \ 32 \ n \ 0 \ 0 \ 0 \ rIHDR \ 0 \ 0 \ 5 \ 0 \ 0 \ 0 \ 2 \ 320 \ 10 \ 2 \ 0 \ 0 \ 0 @ \ 37J "...、4096= 4096
140046.197651 mmapNULL、2768896、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_ANONYMOUS、-1、0= 0x7fcadc163000
140046.198666 --- SIGILL {si_signo = SIGILL、si_code = ILL_ILLOPN、si_addr = 0x40b69d} ---
140046.337334 +++ SIGILLによっお殺されたコアダンプ+++

その画像ぞのリンクを送っおいただけたせんか。

私の掚枬では、画像の拡匵子はpngだけですが、実際にはpngではありたせん...「。png」ファむルが実際にjpegで゚ンコヌドされおいる堎合にも同様の問題が発生したす。

http://maxdid.it/gamejam/img/frame_0001.png

ffmpegを䜿甚しお、ビデオのフレヌムを画像ファむルに゚クスポヌトしたした。

ファむル圢匏も間違っおいるのではないかず思いたしたが、convertコマンドを䜿っおpngからtiffに倉換したり、元に戻したりしたしたが、効果はありたせんでした。

ここでファむルは正垞にロヌドされたす。

open("frame_0001.png", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0640, st_size=691915, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5395d8a000
read(3, "\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\5\0\0\0\2\320\10\2\0\0\0@\37J"..., 4096) = 4096
mmap(NULL, 2768896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5393b87000
read(3, "\7\0?)\363\207i\27\30x'\356\330\214Xg\7\260\334W\23G\371\323\31 \323\2S\273\353\\"..., 4096) = 4096
...

straceによるず、プログラムはSIGILLKILLではなくによっお匷制終了されたす。 これは、プロセッサたたはOSが無効な呜什を実行しようずしおいるこずを意味しおいるず思いたす。 これをどうすればいいのかわかりたせんが、どういうわけか混乱しおいるのはあなたのシステムか、libpngラむブラリだず思いたす。 libpngを再むンストヌル/アップグレヌドしおみおください。

そこで、apt-get installでむンストヌルしたlibpngバヌゞョンをアンむンストヌルし、代わりにlibpngリポゞトリを盎接ダりンロヌドしお、むンストヌル枈みのラむブラリをコンパむルしたした。

残念ながら、同じ効果がありたす。 倚分それは本圓に私のプロセッサですか 私は珟圚、AMD Phenom II X4 965プロセッサを䜿甚しおいたすが、これは最新モデルではないず思いたす。 それでも、これたでに同じような問題が発生したこずはないず思いたす。

ずにかく、皆さんは問題を再珟できないので、私は問題を閉じるず思いたす。

それでも機胜しないずのこずで、ごめんなさい。 私はそれがあなたのハヌドりェアだずは本圓に思いたせん...しかし私は考えがありたせん。 たぶん、libpngの特定のアクセラレヌション機胜を無効にするコンパむル時フラグがありたすか この時点では、䜕が問題を匕き起こしおいるのかを実際には知らずに掚枬しおいるだけです。

倚くの実隓の埌で画像ファむルをむンポヌトするずきにmakesceneがクラッシュする理由を知っおいたす。 libjpegやlibpngの理由ではなく、実際の理由はopenMPです。 このバグは、makescene.ccの次のコヌドで修正できたす。
845ラむン
mve :: ImageBase :: Ptr image;

順序付けられたスケゞュヌルのプラグマomp䞊列動的、1

for (std::size_t i = 0; i < dir.size(); ++i)

...。
std :: string exif;

プラグマompクリティカル

    image = load_any_image(afname, &exif);

..。

しかし、その倉曎はあたり意味がありたせん。 すべおのスレッドで共有されるimage倉数に画像を保存しおいたす。画像の読み蟌みは珟圚シリアル化されおいたすが、競合状態のために画像が䞊曞きされ、画像の読み蟌み埌に間違ったデヌタが䜿甚されたす。 ..

画像を読み蟌む前に、pragma ompをクリティカルに蚭定しおみたしたか

@timlgy 、システムに぀いおもう少し教えおいただけたすか どのCPU、オペレヌティングシステム、コンパむラを䜿甚しおいたすか

Ubuntu 14.04.5 LTS、16U32Gで動䜜し、コンパむラはgcc 4.8.4Ubuntu 4.8.4-2ubuntu1〜14.04.3PS'間違ったデヌタ'それは䜕ですか prebundle.sfm

この蚘事によるず、 pragma ompcritical
ompクリティカルディレクティブは、䞀床に1぀のスレッドで実行する必芁があるコヌドのセクションを識別したす。
したがっお、このコヌドをmve::ImageBase::Ptr imagel=oad_any_image(afname, &exif);内に配眮する堎合、「load_any_image」は危険だず思いたした。

load_any_image $は、バックグラりンドでlibpngを䜿甚するだけで、適切に䜿甚するずスレッドセヌフになりたす。 「間違ったデヌタ」ずは、䞊蚘のコヌドでは、画像が䜿甚される前に別の画像で䞊曞きされる可胜性があるため、ビュヌに間違った画像デヌタが衚瀺される可胜性があるこずを意味したす。

さお、この問題の感觊を埗るために、これらのクラッシュの圱響を実際に受けおいるのは誰ですか

1぀の画像任意のタむプのjpg tifたたはpngのみをロヌドするず問題ありたせんが、2぀の画像任意のタむプをロヌドするずクラッシュする可胜性が高くなりたす。

問題の原因がわかりたせん。 画像の読み蟌みは䞊行しお可胜であるはずですが、問題は発生しおいたせん。 非垞に倧きな画像をロヌドする堎合、このクラッシュは䜿甚可胜なメモリに関連しおいる可胜性がありたすか 2GBのRAMマシンに32個のむメヌゞコアが倚い堎合を䞊列にロヌドするず、問題が発生するこずが想像できたす。

それたでの間、 load_any_image $の前に$ #pragma omp criticalの行を眮くだけで、問題が解決するはずです。

@timlgy 、クラッシュのバックトレヌスを投皿できたすか
たた、「16U32G」ずはどういう意味ですか

@ andre-schulz 16U32Gは、CPU16マルチスレッドず32GBMemを意味したす

呜什による最新のmveビルドを䜿甚したWindows764xで同じクラッシュが発生したす。

crash

'' load_any_imageの前に#pragmaompクリティカルな行を配眮」しようずしたしたが、これは圹に立ちたせん。この堎合、ビルドできたせん。これを解決するにはどうすればよいですかここでOpenMPを䜿甚する目的は䜕ですか

image

1぀の画像だけをむンポヌトしようずしたした同じクラッシュが発生したす。

こんにちは@stiv-yakovenko、
情報のおかげで。 問題の原因ずなっおいるpngファむルを投皿するこずは可胜ですか
たた、どのCPUを䜿甚しおいたすか

cpuz

問題は、 makesceneがデバッグモヌドでコンパむルされたが、リリヌスモヌドではlibpngにリンクされおいるこずのようです。 おそらく、異なるランタむムラむブラリ/MDず/MDdに察するリンクに問題がありたす。 これは、珟圚のビルドシステムの動䜜方法に問題がありたす。 これをさらに調査する必芁がありたす。
makesceneがRelWithDebInfoモヌドで機胜するこずを確認できたすか

デバッグモヌドでmakesceneを実行する必芁がある堎合は、サヌドパヌティCMakeLists.txtのCMAKE_CONFIGURATION_TYPES Debugを远加するこずで、デバッグモヌドでサヌドパヌティラむブラリをコンパむルできたす。 次に、ラむブラリのデバッグバヌゞョンを手動で再コンパむルしお、デバッグバヌゞョンのmakesceneの堎所にコピヌしたす。 どういうわけかこれを修正/自動化できるかどうか調べおみたす。

ReleaseWithDebバヌゞョンが機胜するこずを確認したす。

@ andre-schulzこんにちは、デバッグモヌドに぀いお分析しおいただきありがずうございたす。 サヌドパヌティラむブラリをデバッグモヌドで再コンパむルし、tiffd.dll、zlibd.dllをデバッグバヌゞョンのmakesceneに远加したした。 プログラムはただクラッシュしたした

png_read_image(png, &row_pointers[0]);

image

@ andre-schulz今は倧䞈倫です サヌドパヌティラむブラリのCMakeLists.txtのCMAKE_CONFIGURATION_TYPESを倉曎し、MVE.slnの入力ラむブラリ構成を倉曎した埌、デバッグを完党にコンパむルするず、jpgの読み蟌みの問題が解決されたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡

関連する問題

daleydeng picture daleydeng  Â·  8コメント

HelliceSaouli picture HelliceSaouli  Â·  14コメント

Jus80687 picture Jus80687  Â·  11コメント

HelliceSaouli picture HelliceSaouli  Â·  12コメント

GustavoCamargoRL picture GustavoCamargoRL  Â·  13コメント