Mono AOT编译程序的事后调试

dan*_*n04 12 linux mono gdb

我有一个大型程序,用C#编写并在使用Mono的Linux系统上运行,偶尔会崩溃并导致mono.bin进程转储核心.

我运行gdb了一些核心转储文件,但它不是很有用,因为回溯没有C#函数的名称.根据这个讨论,我发现:

它不会起作用.构造托管堆栈跟踪所需的信息包含在运行时数据结构中,并且仅在程序运行时可用.您可以AOT您的应用程序,然后您将有更多可用的堆栈跟踪.

所以我做了.我AOT编译了所有的C#DLL和EXE文件.使用--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 ?? ()
Run Code Online (Sandbox Code Playgroud)

另一个主题有:

#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 ?? ()
Run Code Online (Sandbox Code Playgroud)

和其他线程似乎已经空闲状态(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
Run Code Online (Sandbox Code Playgroud)

为什么所有*.dll.so文件都"找不到调试符号"?DLL本身是否需要以"调试"模式或其他方式构建?

更一般地说,有没有办法从Mono核心转储中获取托管堆栈跟踪?(不使用mono_pmip,因为只有在进程运行时才可用.)

twi*_*wid 2

我对单声道一无所知。但是从提供的堆栈跟踪来看......它显示无法获取单声道运行时的符号。这是使用 gdb 进行调试的链接。你需要带有符号的 mono-runtime,即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
Run Code Online (Sandbox Code Playgroud)

希望您觉得它有帮助...