你如何确定ip(null)时发生segfault的位置?

时间:2017-11-10 00:57:36

标签: linux debugging gcc

segfault at 0 ip (null) sp bf9ed55c error 4 in appname[8048000+252000]

如果我没有IP地址,我该如何确定崩溃发生的位置?是(null)是否意味着什么有用?

appname [8048000 + 262000] = 0x82Aa000中的

是否应该提供线索?是我应该尝试使用的值是0x82AA000,nm输出和地图文件都没有给予很多帮助。

1 个答案:

答案 0 :(得分:1)

可以将指令指针设置为NULL的东西:

  • 分支为NULL
  • 调用NULL
  • 返回NULL

在前两种情况下,堆栈仍处于分支或调用来自的帧的状态。在最后一种情况下,可能某些东西已经破坏了前一个函数的堆栈上的返回地址,并且可能不清楚堆栈应该是什么,但通常它仍然可以找到一些早期的堆栈帧并尝试重建从那里发生的事情。

可以在不同的地址加载二进制文件。 appname[8048000+252000]描述了文件appname中的一个段,该段已映射到地址8048000 - 82aa000的内存中,但它并未查明出现故障的位置。

使用核心转储调试会更好,其中包含有关状态的详细信息(例如其他寄存器)以及映射到内存的内容(包括堆栈的内容)。如果您使用systemd,则coredump存储在日记中,可以使用coredumpctl进行检索(例如,使用coredumpctl gdb开始调试上次崩溃)。