使用GDB从核心文件调试C++

Tim*_*ley 1 c++ gdb exception

GDB似乎总是适用于C程序,但对于C++,我经常得到这些神秘的堆栈:

(gdb) bt
#0  0x08055fa4 in std::runtime_error::what ()
#1  0x080576c8 in std::runtime_error::what ()
#2  0x08057dda in std::runtime_error::what ()
#3  0x080580d2 in std::runtime_error::what ()
#4  0x08058662 in std::runtime_error::what ()
#5  0x08058725 in std::runtime_error::what ()
#6  0x0806ef7a in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*> ()
#7  0x00c0adec in __libc_start_main () from /lib/libc.so.6
#8  0x0804d011 in std::runtime_error::what ()
Run Code Online (Sandbox Code Playgroud)

从表面上看,它没有提供关于问题发生位置的线索.反正有没有从这样的核心文件中获取更多信息 - 或者让程序转储更有用的东西?

Dav*_*ner 5

std::runtime_error::what()实际覆盖范围从0x0804d011到0x08058725 的文本不太可能是回溯所建议的.这将超过45KB的代码.

尝试解析0x08055fa4,0x080576c8等的符号查找代码更有可能只是定位std::runtime_error::what()为这些地址之前的最后一个可用符号,这通常是剥离可执行文件的结果(正如您通过-s切换到链接器).

我专注于堆栈帧#6.由于这是一个相当简单的类的ctor,我的SWAG将是你传入一个NULL指针或指向非NULL终止字符串的指针.

编辑:请注意,如果您只是在没有-s开关的情况下从完全相同的源重建可执行文件,您将GDB使用core您已有的文件获得更多可用的堆栈.无需等待新构建的可执行文件core再次转储.