【问题标题】:How to debug a crashed Linux program by its glibc/malloc backtrace (no core available)?如何通过 glibc/malloc 回溯调试崩溃的 Linux 程序(无可用内核)?
【发布时间】:2018-11-15 18:40:39
【问题描述】:

我有一个在远程服务器上运行的 C++ 应用程序。我最近介绍了很多新代码。由于担心崩溃,我设置了ulimit -c unlimited,一段时间后我遇到了崩溃,带有一个核心转储,它帮助我调试了一个问题。出于商业原因,正在运行的二进制文件没有调试符号,但我的 PC 上确实有 with-symbols 二进制文件,因此调试很容易。

今天更新的服务再次崩溃,不幸的是这次它没有产生核心转储(旧的core 文件仍然存在,未受影响,我想这可能是某种预期的行为)。这次崩溃发生在 realloc() 内部,所以它向我展示了这个到 stdout 的堆栈跟踪:

*** Error in `./MyApp': corrupted double-linked list: 0x0000000003a04940 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f05ed2897e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x7e6ed)[0x7f05ed2906ed]
/lib/x86_64-linux-gnu/libc.so.6(+0x81cde)[0x7f05ed293cde]
/lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x54)[0x7f05ed296184]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x358)[0x7f05ed296a18]
./MyApp[0x453f58]
./MyApp[0x454a42]
./MyApp[0x457cd6]
./MyApp[0x45eb19]
./MyApp[0x49cfd7]
./MyApp[0x49707b]
./MyApp[0x70734e]
...
a lot more lines
...
./MyApp[0x664c65]
./MyApp[0x73e7b2]
./MyApp[0x70d849]
./MyApp[0x783af4]
./MyApp[0x425da8]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f05ed232830]
./MyApp[0x43a0c9]
======= Memory map: ========
...
< a huge table of memory mappings, ending with: >
Aborted (core dumped)

如上所说,core文件与上次crash没有变化,所以不能使用。

我想知道是否可以使用此堆栈跟踪来手动找出哪个函数触发了破坏一切的 realloc()。我使用提到的地址尝试了addr2line,但我觉得它把我送到了错误的地方,因为它们完全不相关。可能我应该以某种我不理解并且在谷歌搜索后无法找到的方式使用内存映射。是否有使用此类堆栈跟踪的指南?

【问题讨论】:

  • 这个地址是否由内存随机器对齐?您是否尝试在 objdump 中通过调用指令进行搜索?
  • 哇,是的,解决了。我已经通过 objdump 运行了带有符号的二进制文件,这个堆栈跟踪的地址与 objdump 的地址匹配,堆栈跟踪现在有意义了。非常感谢!随意将您的 objdump 建议变成答案:)

标签: c++ linux glibc coredump debug-backtrace


【解决方案1】:

objdump - 来自 GNU 工具链的一个很酷的程序,它可以显示有关二进制文件的信息。链接库、内存对齐、函数表等等。

常用:
objdump -T &lt;file&gt;

还有一些工具可以帮助您。比如nm 或readelf(用于elf 文件)。

nm -g -C &lt;file&gt;
readelf -sW &lt;file&gt;

【讨论】:

  • 如 cmets 中所述,objdump 解码了我的 with-symbol 二进制文件中的所有指令,并从 realloc 堆栈跟踪中搜索与我预期的确切指令匹配的地址;出于某种原因,addr2line 给出了误导性的结果,可能是因为我的二进制文件是用 -O2 编译的。
猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多