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)
从表面上看,它没有提供关于问题发生位置的线索.反正有没有从这样的核心文件中获取更多信息 - 或者让程序转储更有用的东西?
std::runtime_error::what()实际覆盖范围从0x0804d011到0x08058725 的文本不太可能是回溯所建议的.这将超过45KB的代码.
尝试解析0x08055fa4,0x080576c8等的符号查找代码更有可能只是定位std::runtime_error::what()为这些地址之前的最后一个可用符号,这通常是剥离可执行文件的结果(正如您通过-s切换到链接器).
我专注于堆栈帧#6.由于这是一个相当简单的类的ctor,我的SWAG将是你传入一个NULL指针或指向非NULL终止字符串的指针.
编辑:请注意,如果您只是在没有-s开关的情况下从完全相同的源重建可执行文件,您将GDB使用core您已有的文件获得更多可用的堆栈.无需等待新构建的可执行文件core再次转储.