11

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

0000000 处的段错误 rip 00003f32a823 rsp 000123ade323 错误 4

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

4

2 回答 2

7

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

在映射文件中,您将有一个函数列表及其起始地址。当您加载应用程序时,它被加载到一个基地址。rip 指针 - 基地址为您提供映射文件地址。然后,如果您在映射文件中搜索从略低于 rip 指针的地址开始的函数,然后在列表中跟随具有更高地址的函数,则您已找到崩溃的函数。

从那里您需要尝试确定代码中出了什么问题。它不是很有趣,但它至少给了你一个起点。

编辑:“段错误”位告诉你,我敢打赌,你已经取消引用了一个 NULL 指针。rsp 是当前堆栈指针。唉,它可能不是那么有用。通过内存转储,您“可能”能够更准确地确定函数中的位置,但很难准确地确定优化构建中的位置

于 2009-09-21T21:20:37.083 回答
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。有时地址不完全匹配,但几乎就在那里。

于 2011-01-24T07:18:11.727 回答