更快地使用 GDB 分析核心转储

Faster using of GDB to analyze core dump

我需要在段错误后检查堆栈跟踪。加载符号大约需要 10 分钟。 当我尝试检查 coredump (gdb <program> -c <core>) 时,我得到:warning: core file may not match specified executable file. 然后堆栈跟踪是:

(gdb) bt
#0  0x00007f96eab3d72a in ?? ()
#1  0x00007f96ec846239 in ?? ()
#2  0x0000000000006b04 in ?? ()
#3  0x00007fff64076500 in ?? ()
#4  0x00007fff64076570 in ?? ()
#5  0x00007f96ec846192 in ?? ()
#6  0x00007f96ba5144e0 in ?? ()
#7  0x0000000000549fa0 in ?? ()
#8  0x0000000000549fa8 in ?? ()
#9  0x0000000000549fa8 in ?? ()
#10 0x0000000000549fa8 in ?? ()
#11 0x0000000000000000 in ?? ()

段错误后是否可以加速检查堆栈跟踪?

Loading symbols remain about 10 minutes.

大概是因为 "symbols" 包含完整的调试信息。

您没有说明要分析核心转储的内容。一个通常的要求是简单地确定核心转储发生在哪个函数中,that 只需要符号 table,而不是完整的调试信息。

因此,您想要的可能是:

cp a.out-full-debug a.out-symbols-only
strip -g a.out-symbols-only

# Symbol loading should be much quicker
gdb ./a.out-symbols-only ./core

显然,对于任何给定的构建,您只需要 运行 strip 一次。

你也没说你用的是哪个compiler/OS。如果我们假设使用最新版本的 GCC 或 Clang,您还可以使用 separate debug info files, and -gsplit-dwarf -gdwarf-4 flags. See this answer.

显着加快 GDB 符号加载速度