C# で記述され、Mono を使用して Linux システムで実行されている大規模なプログラムがあり、クラッシュしてmono.bin
プロセスがコア ダンプすることがあります。
いくつかのコア ダンプ ファイルを実行gdb
しましたが、バックトレースに C# 関数の名前が含まれていないため、あまり役に立ちませんでした。この議論によると、私は見つけました:
うまくいきません。マネージ スタック トレースを構築するために必要な情報は、ランタイム データ構造に含まれており、プログラムの実行中にのみ使用できます。アプリケーションを AOT にすると、より使いやすいスタック トレースが得られます。
だから、私はしました。すべての C# DLL および EXE ファイルを AOT コンパイルしました。--aot=write-symbols
オプションの使用。意図的にクラッシュする私のプログラムのテストバージョンの場合、これによりバックトレースがより便利になるかどうかを確認できます。そして、これまでのところ、そうではありません。メイン スレッドからのバックトレースは次のようになります。
#0 0xb7fc8402 in __kernel_vsyscall ()
#1 0x00556df0 in raise () from /lib/libc.so.6
#2 0x00558701 in abort () from /lib/libc.so.6
#3 0x080e59b5 in ?? ()
別のスレッドには次のものがあります。
#0 0xb7fc8402 in __kernel_vsyscall ()
#1 0x005f6753 in poll () from /lib/libc.so.6
#2 0xb6f735a7 in Mono_Unix_UnixSignal_WaitAny ()
from /opt/novell/mono/lib/libMonoPosixHelper.so
#3 0xb5416578 in ?? ()
nanosleep
また、他のスレッドは ( 、pthread_cond_timedwait
、pthread_cond_wait
、sem_timedwait
、またはで)アイドル状態だったようですsem_wait
。しかし、すべてのバックトレースに共通することは、それらがその迷惑なin ?? ()
で終わり、「私の」コードからの関数名を決してリストしないことです。
gdb
これは、起動時に出力されたいくつかのメッセージに関連していると思います。例えば、
Reading symbols from /xyz/mono/log4net.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/log4net.dll.so
Reading symbols from /xyz/mono/Contoso.Util.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/Contoso.Util.dll.so
Reading symbols from /xyz/mono/Contoso.Printing.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/Contoso.Printing.dll.so
Reading symbols from /xyz/mono/Contoso.LegacyDataConverter.dll.so...(no debugging symbols found)...done.
Loaded symbols for /xyz/mono/Contoso.LegacyDataConverter.dll.so
*.dll.so
すべてのファイルに「デバッグ シンボルが見つかりません」と表示されるのはなぜですか? DLL 自体を「デバッグ」モードでビルドする必要がありますか?
より一般的に言えば、Mono コア ダンプからマネージド スタック トレースを取得する方法はありますか? (mono_pmip
プロセスが実行されているときにのみ使用できるため、を使用しないでください。)