Linux版C中的崩溃报告

时间:2020-03-05 18:49:11  来源:igfitidea点击:

遵循以下问题:
C#中的良好崩溃报告库

是否有像CrashRpt.dll这样的库在Linux上具有相同的功能?也就是说,生成包括核心转储和任何必要环境的故障报告,并通知开发人员吗?

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

解决方案

回答

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

回答

@Ionut
这可以处理核心转储,但不能处理其他用户崩溃时通知开发人员的情况。

回答

请参阅自动在堆栈溢出上在Unix系统上获取堆栈跟踪。

回答

注意:在x86 seg-fault崩溃中有两个有趣的寄存器。

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

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

int j = *i

到:

int j = i[2];

然后,我们尝试访问地址" 0x00000008",这就是在CR2中找到的地址。

回答

内森,在什么情况下某个细分受众群的基数为非零?我在Linux应用程序开发的5年中从未见过这种情况。

谢谢。

回答

@马丁

我对x86进行了架构验证,因此我对处理器提供的架构非常熟悉,但是对它的使用方式却非常陌生。这就是我的评论依据。如果可以指望CR2给出正确的答案,那我就更正了。

回答

内森,我并不是要坚持你是不对的。我只是说,在我(有限的)Linux经验中,段基始终为零。也许这是我要问的一个好问题...