linux - ip(null)时如何判断段错误发生在什么地方?

标签 linux debugging gcc

appname[8048000+252000] 中的 0 ip (null) sp bf9ed55c 错误 4 出现段错误

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

在 appname[8048000+262000] = 0x82Aa000 中是否应该提供线索? 0x82AA000 是我应该尝试使用的值吗,nm 输出和映射文件都没有提供太多帮助。

最佳答案

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

  • 跳转到 NULL
  • 调用 NULL
  • 返回NULL

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

二进制文件可以加载到不同的地址。 appname[8048000+252000] 描述文件 appname 中的一个段,它被映射到地址为 8048000-82aa000 的内存中, 它没有查明故障出在哪里。

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

关于linux - ip(null)时如何判断段错误发生在什么地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47214135/

相关文章:

c - 是什么导致调用 inb_p() 时出现段错误?

linux - 在linux中将文件从一台服务器复制到另一台服务器

debugging - 如何调试 htaccess 重写脚本

c - 在 GDB 中编写 NSPrintForDebugger 以在 C 中打印对象

c - 下面的代码出现段错误。我不知道我哪里出了问题

c++ - 如何将 std::array 实例地址作为参数传递给 std::min_element?

linux - 无法在 shell 脚本中运行 if 条件

linux - Linux脚本的源代码和./执行之间的区别

c++ - 如何调试 'value of ESP was not saved across function call'错误?

c - 改进我执行 malloc 和 free 的方式