12

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_timedwaitpthread_cond_waitsem_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プロセスが実行されているときにのみ使用できるため、を使用しないでください。)

4

2 に答える 2

4

suspend-on-sigservプロセスがクラッシュしたときに設定してアタッチすることは可能ですか? これはライブ環境であると想定しているため、不可能な場合があります。

それができれば、探している情報を見つけることができるはずです。

ドキュメントから:

MONO_DEBUG

設定すると、デバッグに役立つランタイムの一部の機能が有効になります。この変数には、デバッグ オプションのカンマ区切りのリストが含まれている必要があります。現在、次のオプションがサポートされています。

...

サスペンド オン sigsegv

このオプションは、ネイティブ SIGSEGV を受信したときにプログラムを中断します。ライブ プロセスにはコア ファイルよりも多くの情報が含まれているため、これは gdb では発生しないクラッシュのデバッグに役立ちます。

于 2013-06-11T10:52:37.857 に答える
2

モノについてはわかりません..しかし、提供されたスタックトレースを見ると..モノランタイムのシンボルを取得できないことが示されています。here は、gdb を使用したデバッグを提供するリンクです。シンボルを含むモノランタイム、つまりシンボルsoを含むライブラリが必要です...したがって、mono-runtime-dbgをインストールする必要があります... apt-get、yum、wgetなどのツールを使用してインストールできます。

unbuntu がインストールされています..次の出力が表示されます....

$ apt-cache search mono-runtime-dbg
mono-runtime-dbg - Mono runtime, debugging symbols

Then
$ apt-get install mono-runtime-dbg

お役に立てば幸いです...

于 2013-06-06T13:22:16.263 に答える