在Linux中使用C语言进行崩溃报告

4

在这个问题之后:
c#中好的崩溃报告库

是否有像CrashRpt.dll一样的库在Linux上执行相同的操作?即生成包括核心转储和任何必要环境的故障报告并通知开发人员?

编辑:这似乎是此问题的重复。

7个回答

3

我并不是要泼你的冷水,我只是想把这个链接作为一个补充资源提供。我仍然对将回溯信息传递给开发人员的方法感兴趣(例如kerneloops.org)。到目前为止,收集环境和相关数据似乎取决于各个开发人员。 - T Percival

2

使用调试符号编译您的代码,在 shell 中输入 unlimit coredumpsize,您将在与二进制文件相同的文件夹中获得核心转储。使用 gdb/ddd - 先打开程序,然后打开核心转储。您可以查看此处获取额外的信息。


1

@Ionut
这个处理程序负责生成核心转储,但它不会在其他用户遇到崩溃时通知开发人员。


0

注意:在 x86 段错误崩溃中有两个有趣的寄存器。

第一个是EIP,它指定了异常发生的代码地址。在 RichQ 的回答中,他使用 addr2line 显示与崩溃地址对应的源行。但是 EIP 可能无效;如果您调用一个空的函数指针,它可能是 0x00000000,如果您破坏了调用堆栈,返回值可以将任意随机值弹出到 EIP 中。

第二个是CR2,它指定了导致分段错误的数据地址。在 RichQ 的示例中,他将 i 设置为 null 指针,然后访问它。在这种情况下,CR2 将是 0x00000000。但是如果您更改:

int j = *i

至:

int j = i[2];

那么你正在尝试访问地址0x00000008,这就是在CR2中找到的内容。


请注意,CR2实际上是故障访问的线性地址,而0x00000008是虚拟偏移量。如果段基址非零,则两者将不同,并且CR2将报告segment_base+0x00000008 - Nathan Fellman

0
Nathan,在分段基础上,什么情况下才会出现非零?在我5年的Linux应用开发中从未见过这种情况。谢谢。

0

@马丁

我为x86进行架构验证,因此我非常熟悉处理器提供的体系结构,但对其如何使用非常不熟悉。这就是我发表评论的基础。如果可以信任CR2给出正确的答案,那么我会改正我的评论。


0
Nathan,我并不是在坚持你是错误的;我只是说,在我(有限的)使用Linux的经验中,段基地址总是零。或许这是我要问的一个好问题…

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接