【发布时间】:2014-01-03 17:40:31
【问题描述】:
当调试一个断言失败的程序时,我无法在 gdb 中获取调用堆栈。我在 Mavericks 上使用 Homebrew 的 g++4.8 和 gdb。
/usr/local/bin/g++-4.8 --version
g++-4.8 (GCC) 4.8.2
/usr/local/bin/gdb --version
GNU gdb (GDB) 7.6.2
这是重构问题的最小测试
//test.cpp
#include <iostream>
#include <cassert>
int main()
{
int i = 42;
std::cout << "Hello World!" << i << std::endl;
assert(0); // this also happens with abort() which assert(0) winds up calling
}
编译和使用
/usr/local/bin/g++-4.8 -g -c test.cpp -o test.o
/usr/local/bin/g++-4.8 -g test.o -o test
/usr/local/bin/gdb test
(gdb) r
Starting program: /Users/pmelsted/tmp/test/test
Hello World!42
Assertion failed: (0), function main, file test.cpp, line 7.
Program received signal SIGABRT, Aborted.
0x00007fff9447d866 in ?? ()
(gdb) where
#0 0x00007fff9447d866 in ?? ()
#1 0x00007fff9229835c in ?? ()
#2 0x0000000000000000 in ?? ()
【问题讨论】:
-
我在不同的操作系统(Ubuntu 12.04,32 位)上按照您的步骤操作,无法重现该问题;很正常的堆栈转储。我必须承认这是 g++ (4.6.3) 和 gdb (7.4-2012.04) 的旧版本。只是一个想法:您是否尝试过选项
-ggdb? -
-ggdb 在这里没有区别。我的感觉是,这与 mac 相关,因为任何如此简单的东西都无法通过 linux 上的测试。
-
请检查您的可执行文件是否包含调试信息,按照此线程中的说明进行操作:stackoverflow.com/questions/8390881/… 关闭所有优化并尝试使用不同的调试选项和格式(
-gdwarf-2、-gstabs、-gsplit-dwarf等);见gcc.gnu.org/onlinedocs/libstdc++/manual/debug.html -
这些选项都没有任何区别。 mac 上的 nm 程序没有 --debug-sym 选项。调试时,我可以单步调试并查看源代码,甚至打印变量的值,只是断言失败。
-
这个本地安装的 gcc 是否带有自己的 libstdc++.so,还是使用操作系统提供的那个?那个库是用调试信息编译的吗?