12

我有一个用 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 ?? ()

另一个线程有:

#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 ?? ()

其他线程似乎一直处于空闲状态(在nanosleeppthread_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

我不知道单声道..但是从查看提供的堆栈跟踪..它显示无法获取单声道运行时的符号。这是使用 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 回答