我正在尝试使用gdb在Eclipse中调试C++程序.我认为它在我的main()函数中工作正常,但是在我尝试查看变量的值时,它会给我一个警告:
Failed to execute MI command:
-data-evaluate-expression variable
Error message from debugger back end:
Could not find the frame base for "Class::method()".`
Run Code Online (Sandbox Code Playgroud)
在搜索互联网之后,我很难理解这个错误的含义或找出如何解决问题.Stack Overflow 还有一些类似的问题(这里和这里).
由于Apple的Xcode命令行工具已经过时了(请参阅gcc和gdb问题),我需要使用自己的自制版本.我不知道这些工具的设置中是否有我可能错过的东西.
我可以使用gdb从命令行调试,我遇到了同样的错误:"Could not find the frame base for "Class::method()"所以我很确定它不是Eclipse的问题.
是否有任何事情可能导致这个问题?
-O0和-g3)更新:
我也看到了这条线:
BFD: /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork(i386:x86-64): unknown load command 0x20
Run Code Online (Sandbox Code Playgroud)
接下来是几个警告:
warning: Could not open OSO archive file "/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/../libsupc++/.libs/libsupc++convenience.a"
warning: …Run Code Online (Sandbox Code Playgroud) 我在MacOS Lion上使用GDB 7(7.3)遇到了麻烦.
我做的是:
$ sudo port install gdb
Run Code Online (Sandbox Code Playgroud)
之后将GDB安装到:/ opt/local/bin/ggdb
但是当我尝试执行GDB时,我总是在开始时收到以下内容:
BFD: unable to read unknown load command 0x24
BFD: unable to read unknown load command 0x26
BFD: unable to read unknown load command 0x24
BFD: unable to read unknown load command 0x26
Run Code Online (Sandbox Code Playgroud)
进一步它告诉我:
从......完成阅读符号.
但是当我试图通过'bt'获得回溯时,我只看到未解决的函数地址.我试图在我的应用程序文件夹中设置LIBRARY_PATH.
$ export DYLD_LIBRARY_PATH=`pwd`
Run Code Online (Sandbox Code Playgroud)
但没有成功.问题仍然存在.
使用Lion/Xcode提供的默认GDB 6.3可以正常工作.
提前感谢任何建议.
我最近通过MacPorts在我的OS X 10.7系统上安装了GCC 4.7.3和GDB 7.6,以便能够编译C++ 11代码.我不能使用Apple的自制clang ++和gdb,因为它不允许我正确调试标准模板库代码(例如,如果我取消引用列表迭代器,程序崩溃).
现在,通过新的GCC/GDB组合,我在进入函数时遇到了一些奇怪的问题.拿这个最小的例子:
#include <stdio.h>
class A {
public:
virtual void testMethod() {
printf("test in A\n");
}
};
void test(A &a) {
printf("asdf\n");
a.testMethod(); // here, stepping works with -std=c++11
}
int main() {
A a;
a.testMethod();
test(a);
a.testMethod();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我编译代码g++ -O0 -ggdb test.cpp,GDB根本不会介入A::testMethod.我可以通过指定内部的代码行来设置断点A::testMethod,但不能通过指定方法名称(b A::testMethod())来设置断点.
更奇怪的是,如果我编译,如果g++ -O0 -ggdb -std=c++11 test.cpp从中调用,GDB会进入testMethod void test().从主要的,踩踏仍然不起作用.但是,现在,我可以通过仅指定方法名称来设置断点.
此外,一旦我在GDB中启动程序,我就会收到GDB警告,如相关问题中所述.无论是否指定,都会显示这些警告-std=c++11.
warning: Could not …Run Code Online (Sandbox Code Playgroud)