在这个问题之后:
C#中的良好崩溃报告库
有没有像 CrashRpt.dll 这样的库在 Linux 上做同样的事情?也就是说,生成包含核心转储和任何必要环境的故障报告并通知开发人员?
编辑:这似乎是这个问题的副本
在这个问题之后:
C#中的良好崩溃报告库
有没有像 CrashRpt.dll 这样的库在 Linux 上做同样的事情?也就是说,生成包含核心转储和任何必要环境的故障报告并通知开发人员?
编辑:这似乎是这个问题的副本
请参阅Stack Overflow 上自动获取 Unix 系统上的堆栈跟踪。
使用调试符号编译您的代码,在您的 shell 中输入 unlimit coredumpsize,您将在与二进制文件相同的文件夹中获得一个 coredump。使用 gdb/ddd - 先打开程序,然后再打开核心转储。您可以查看此内容以获取更多信息。
@Ionut
这处理生成核心转储,但它不处理在其他用户发生崩溃时通知开发人员。
x86
注意: seg-fault 崩溃中有两个有趣的寄存器。
第一个EIP指定发生异常的代码地址。在 RichQ 的回答中,他使用 addr2line 来显示对应崩溃地址的源代码行。但EIP可能无效;如果你调用一个为空的函数指针,它可以是0x00000000
,如果你破坏了你的调用堆栈,返回可以将任何随机值弹出到 EIP 中。
第二个,CR2,指定导致分段错误的数据地址。在 RichQ 的示例中,他将 i 设置为空指针,然后访问它。在这种情况下,CR2 将是0x00000000
。但如果你改变:
int j = *i
到:
int j = i[2];
然后您尝试访问 address 0x00000008
,这就是 CR2 中的内容。
内森,在什么情况下段基数非零?在我 5 年的 Linux 应用程序开发中,我从未见过这种情况。
谢谢。
@马丁
我为 x86 做架构验证,所以我对处理器提供的架构非常熟悉,但对它的使用方式非常不熟悉。这就是我发表评论的依据。如果可以指望 CR2 给出正确的答案,那我就更正了。
内森,我并没有坚持认为你是不正确的;我只是说,在我(有限的)Linux 经验中,段基数始终为零。也许这对我来说是个好问题……