我有一个在远程服务器上运行的 C++ 应用程序。我最近介绍了很多新代码。害怕崩溃,我已经设置ulimit -c unlimited
了一段时间,然后我遇到了一个崩溃,一个 coredump 帮助我调试了一个问题。出于商业原因,正在运行的二进制文件没有调试符号,但我的 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)
如上所述,核心文件与之前的崩溃没有变化,因此无法使用。
我想知道是否可以使用此堆栈跟踪来手动找出哪个函数触发了破坏一切的 realloc()。我尝试addr2line
使用提到的地址,但我觉得它把我带到了错误的地方,因为它们完全不相关。可能我应该以某种我不理解并且在谷歌搜索后无法找到的方式使用内存映射。是否有使用此类堆栈跟踪的指南?