3Dモデルのオフスクリーンレンダリング用のC++ツールを作成しました。レンダリングはOSMesaライブラリを使用して行われます。lib OSMesaオフスクリーンコンテキストの作成はC++では失敗しますが、静的にリンクされている場合のみです
ソフトウェアは完璧に1年以上働いていましたが、私は6ヶ月前のように更新を停止しました。その間、私の開発環境は何度も更新されました。
ここでもう一度コンパイルしていて、予期しないバグが見つかりました。
ソフトウェアの平凡なバージョンは、期待どおりに動作していましたが、静的にリンクされたものはセグメンテーションしています。
OSmesaの設定/コンパイル/リンクの手順ではなく、ライブラリコードでエラーが発生していると想定していますが、セグメンテーションフォールトのデバッグに関するアドバイスは有益です。
コンパイルプロセスのさまざまなバリエーションを成功させることなく試してみましたが、今はかなり固執しています。 誰かが愚かな何かを見ることができます私はいくつかの以下のステップでやっていますか?
私は、私のシステム(12.0.6)での作業のUbuntuベースのシステムを使用して(すべての非必要な機能を無効にされた共有ライブラリの同じバージョンでOSmesaライブラリの静的バージョンを再コンパイルOSmesa IIbの静的なバージョンがリポジトリから利用できません):
./configure \ --disable-xvmc \ --disable-glx \ --disable-dri \ --with-dri-drivers="" \ --with-gallium-drivers="" \ --disable-shared-glapi \ --disable-egl \ --with-egl-platforms="" \ --enable-osmesa \ --enable-gallium-llvm=no \ --disable-gles1 \ --disable-gles2 \ --enable-static \ --disable-shared
これは私のオフスクリーンレンダリングツールのコンパイルコマンドです:
g++ -std=c++11 -Wall -O3 -g -static -static-libgcc -static-libstdc++ ./src/measure_model.cpp model.o thumbnail.o -o measure_model_debug -pthread -lOSMesa -ldl -lm -lpng -lz -lcrypto
これは私がした警告です静的OSMesaを使用してコンパイルすることによって取得し、それが働いて、静的バイナリでも、一年前に存在した:
/home/XXX/XXX/backend/lambda/mesa/mesa-12.0.6/src/mesa/main/dlopen.h:52: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
は、これは私がツールを実行しているから得るものです:
Segmentation fault (core dumped)
しかしなしセグメンテーションフォールトがあります
#0 0x0000000000000000 in ??() #1 0x00000000004af20a in mtx_init (type=4, mtx=0xe10f70) at ../../include/c11/threads_posix.h:215 #2 _mesa_NewHashTable() at main/hash.c:135 #3 0x000000000052f295 in _mesa_alloc_shared_state ([email protected]=0xdcc9b0) at main/shared.c:67 #4 0x000000000046e717 in _mesa_initialize_context ([email protected]=0xdcc9b0, [email protected]=API_OPENGL_COMPAT, visual=, [email protected]=0x0, [email protected]=0x7fffffffcd40) at main/context.c:1192 #5 0x000000000046c870 in OSMesaCreateContextAttribs ([email protected]=0x7fffffffd290, sharelist=) at osmesa.c:834 #6 0x000000000046ccdc in OSMesaCreateContextExt (format=, depthBits=, stencilBits=, accumBits=, sharelist=) at osmesa.c:660 #7 0x0000000000468742 in generate_thumbnail(Model*, Json::Value)() #8 0x0000000000401c7d in main (argc=, argv=) at ./src/measure_model.cpp:107:私は単にOSmesaコンテキスト作成ステップをスキップした場合に生成(と明らかにすべての3Dレンダリング)
は、これがバックトレースであります
静的にリンクされたバイナリは厳しい要件です。
私はツールをコンパイルするのに使用する同じマシン(OSmesa静的ライブラリも同じマシンでコンパイルされます)でセグメンテーションフォルトが発生していますが、同じツールの静的にリンクされていないバージョンのセグメンテーションフォルトはありません。
gdbで障害プログラムを実行してください。ライブ出力後の出力、bt、info reg、frame1。解体する。 ['mtx_init'はいくつかのpthreadを使用しています](https://github.com/anholt/mesa/blob/master/include/c11/threads_posix.h#L200)mutex/mutex_attr関数は、静的にpthreadの使用にいくつかの問題がありますプログラム。これは悪い考えかもしれませんが、あなたの要件の厳密さを変えようとします(glibcとpthreadへのリンクを古いOSで実行するためにglibc + pthreadsとrpathのコピーをそれらにリンクする)。 – osgx
ありがとうosgx、私はこの追加のデバッグを行い、質問を更新します。静的にリンクされたプログラムでpthreadを使用すると、何か問題がありますか? – pangon
素晴らしいことに、いくつかのテストの後、実際には問題を引き起こす静的にリンクされたpthreadライブラリが判明しました。私の実際のユースケースでは、ほとんどのライブラリを静的にリンクする必要がありますが、中核ライブラリはリンクしません。 dlとpthreadをdinamicallyにリンクさせて、問題を解決しても問題ありません。どうもありがとう。私はC++のバイナリがpthreadにリンクされているというこの制限を見るのが残念です!私はオンラインで見ることができるケースを勉強した後、このpthreadの制限の感覚を知りたいと思っています。ありがとうございました。もう一度@osgxに感謝します。この質問への回答を投稿できるのであれば、賞品を与えてくれます。 – pangon