Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ mac上gdb 7.6缺少带断言的调用堆栈帧_C++_Macos_Gdb - Fatal编程技术网

C++ mac上gdb 7.6缺少带断言的调用堆栈帧

C++ mac上gdb 7.6缺少带断言的调用堆栈帧,c++,macos,gdb,C++,Macos,Gdb,当调试一个断言失败的程序时,我无法在gdb中获得调用堆栈。我使用的是Mavericks上自制的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() {

当调试一个断言失败的程序时,我无法在gdb中获得调用堆栈。我使用的是Mavericks上自制的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
}

MacOS上的gdb似乎无法正确显示64位程序的调用堆栈(或者在assert()函数调用后调用堆栈已损坏)。以下是稍加修改的程序:

//test.cpp
#include <iostream>
#include <cassert>

int foo() {
        assert(0);
}
int bar() {
        return foo();
}
int main()
{
        int i = 42;
        std::cout << "Hello World!" << i << std::endl;
        return bar();
}
因此,所有调试符号都正确显示,前3个函数地址被更正,并且没有名称,因为我的libgcc处于发布模式

如果在编译期间未使用-m32键,则调用堆栈如下所示:

(gdb) bt full
#0  0x00007fff8b442866 in ?? ()
No symbol table info available.
#1  0x00007fff8c64735c in ?? ()
No symbol table info available.
#2  0x0000000000000000 in ?? ()
No symbol table info available.

这绝对是错误的调用堆栈,#2帧函数地址是0x0。因此,根本原因是gdb无法正确显示64位应用程序的调用堆栈。

我找到了解决问题的方法。只需在gdb中将断点设置为abort()函数:

b中止


然后,当调用assert时,它将在断点处停止,此时您可以看到带有
bt

的调用堆栈。我在不同的操作系统(Ubuntu 12.04,32位)上遵循了您的步骤,无法重现该问题;非常正常的堆栈转储。我必须承认,这是g++(4.6.3)和gdb(7.4-2012.04)的旧版本。只是一个想法:您是否尝试过选项
-ggdb
?-ggdb在这里没有区别。我的感觉是,这与mac有关,因为任何这样简单的东西都无法在linux上通过测试。请按照此线程中的说明检查您的可执行文件是否包含调试信息:关闭所有优化并尝试使用不同的调试选项和格式(
-gdwarf-2
-gstabs
-gsplit-dwarf
等);看到这些选项没有任何区别。mac上的nm程序没有--debug sym选项。调试时,我可以一步一步地查看源代码,甚至可以打印变量的值,但断言失败了。这个本地安装的gcc是否自带libstdc++。那么,还是使用“随操作系统提供的一个”在用调试信息编译的库中?知道根本原因很好,谢谢!有人知道是否有办法修复它吗?我不希望所有的调试都用32位完成。
(gdb) bt full
#0  0x9843f952 in ?? ()
No symbol table info available.
#1  0x96193340 in ?? ()
No symbol table info available.
#2  0x9615e43e in ?? ()
No symbol table info available.
#3  0x0000216f in foo () at 15.cpp:6
No locals.
#4  0x0000217b in bar () at 15.cpp:9
No locals.
#5  0x000021e4 in main () at 15.cpp:15
        i = 42
(gdb) quit
(gdb) bt full
#0  0x00007fff8b442866 in ?? ()
No symbol table info available.
#1  0x00007fff8c64735c in ?? ()
No symbol table info available.
#2  0x0000000000000000 in ?? ()
No symbol table info available.