什么是segfault rip / rsp编号以及如何使用它们

时间:2009-09-21 21:11:48

标签: debugging segmentation-fault

当我的linux应用程序崩溃时,它会在日志中生成一行代码:

segfault at 0000000 rip 00003f32a823 rsp 000123ade323错误4

那些rip和rsp地址是什么?我如何使用它们来查明问题?它们对应于“objdump”或“readelf”输出中的某些内容吗?如果我的程序将其符号剥离出来(对于可以使用gdb使用的单独文件),它们是否有用

2 个答案:

答案 0 :(得分:7)

rip指针会告诉你导致崩溃的指令。您需要在地图文件中查找。

在地图文件中,您将获得一系列功能及其起始地址。加载应用程序时,它将加载到基址。 rip指针 - 基地址为您提供地图文件地址。然后,如果您在地图文件中搜索一个从略低于您的rip指针的地址开始的函数,并且在列表中,通过具有更高地址的函数,您找到了崩溃的函数。

从那里你需要尝试识别你的代码中出了什么问题。它不是很有趣,但它至少可以为你提供一个起点。

编辑:“segfault at”位告诉你,我打赌,你已经取消引用了一个NULL指针。 rsp是当前的堆栈指针。可能不是那么有用。通过内存转储,您“可能”能够更准确地找出您在函数中所处的位置,但实际上很难确定您在优化构建中的位置

答案 1 :(得分:3)

我也得到了错误。当我看到:

probe.out[28503]: segfault at 0000000000000180 rip 00000000004450c0 rsp 00007fff4d508178 error 4

probe.out是一个使用libavformat(ffmpeg)的应用程序。我把它拆开了。

objdump -d probe.out

rip是指令运行的地方:

00000000004450c0 <ff_rtp_queued_packet_time>:
  4450c0:       48 8b 97 80 01 00 00    mov    0x180(%rdi),%rdx
  44d25d:       e8 5e 7e ff ff          callq  4450c0 <ff_rtp_queued_packet_time>

最后,我发现该应用程序在函数 ff_rtp_queued_pa​​cket_time

中崩溃了

PS。有时地址不完全匹配,但它几乎就在那里。