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

时间:2015-08-11 08:46:21

标签: debugging gdb

我需要在segfault之后检查堆栈跟踪。加载符号大约需要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 ?? ()

在segfault之后可以加速检查堆栈跟踪吗?

1 个答案:

答案 0 :(得分:2)

  

加载符号大约需要10分钟。

据推测,这是因为“符号”包含完整的调试信息。

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

因此,您可能想要的是:

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一次。

您也没有说明您使用的编译器/操作系统。如果我们假设最新版本的GCC或Clang,您还可以通过使用separate debug info文件和-gsplit-dwarf -gdwarf-4标志来大幅加速GDB符号加载。请参阅this answer