[英]Debugging C++ from core files with GDB
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 ()
表面上哪一个绝对不提供问题发生位置的任何线索。 无论如何,有没有要从这样的核心文件中获取更多信息-或者使程序转储一些更有用的东西?
正如回溯所建议的那样, std::runtime_error::what()
的文本不太可能实际覆盖从0x0804d011到0x08058725的范围。 那将超过45KB的代码。
试图解析0x08055fa4、0x080576c8等的符号查找代码更有可能只是将std::runtime_error::what()
作为这些地址之前的最后一个可用符号定位,这通常是剥离可执行文件的结果(就像您通过-s
切换到链接器一样)。
我将重点讨论堆栈框架6。 由于这是一个相当简单的类的指针,因此我的SWAG将是您传入了NULL指针或指向非NULL终止字符串的指针。
编辑:请注意,如果您只是从完全相同的源中重建可执行文件,而无需使用-s
开关,则将使用已有的core
文件从GDB
获得更多可用的堆栈。 无需等待新建的可执行文件再次转储core
。
我一直使用GDB进行C ++操作,并且堆栈回溯通常没有问题,当然,前提是堆栈没有被某些缓冲区溢出破坏。
C ++程序和C程序中的堆栈回溯没有本质上的区别,应该使您更难以解释回溯。 您确定:
A)您的程序没有以某种方式破坏堆栈?
B)您正在使用-g标志进行编译?
首先,请确保已设置-pg -ggdb
编译器标志:
g++ -pg -ggdb prog.cpp -o prog
第一个为gprof生成分析信息(您可能需要它),第二个在可执行文件中包含调试信息。
要检查核心文件,请使用以下命令:
gdb -quiet -se=prog -c prog.core
这应该始终提供足够的信息来对核心转储进行故障排除:)
干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.