请参考Stack Overflow上的自动获取Unix系统堆栈跟踪。
使用调试符号编译您的代码,在 shell 中输入 unlimit coredumpsize,您将在与二进制文件相同的文件夹中获得核心转储。使用 gdb/ddd - 先打开程序,然后打开核心转储。您可以查看此处获取额外的信息。
@Ionut
这个处理程序负责生成核心转储,但它不会在其他用户遇到崩溃时通知开发人员。
注意:在 x86
段错误崩溃中有两个有趣的寄存器。
第一个是EIP,它指定了异常发生的代码地址。在 RichQ 的回答中,他使用 addr2line 显示与崩溃地址对应的源行。但是 EIP 可能无效;如果您调用一个空的函数指针,它可能是 0x00000000
,如果您破坏了调用堆栈,返回值可以将任意随机值弹出到 EIP 中。
第二个是CR2,它指定了导致分段错误的数据地址。在 RichQ 的示例中,他将 i 设置为 null 指针,然后访问它。在这种情况下,CR2 将是 0x00000000
。但是如果您更改:
int j = *i
至:
int j = i[2];
那么你正在尝试访问地址0x00000008
,这就是在CR2中找到的内容。
@马丁
我为x86进行架构验证,因此我非常熟悉处理器提供的体系结构,但对其如何使用非常不熟悉。这就是我发表评论的基础。如果可以信任CR2给出正确的答案,那么我会改正我的评论。