繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM