我如何获得一个在MacOSX上运行的自制版本的GDB? 我试图用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()".`

我如何获得一个在MacOSX上运行的自制版本的GDB? 我试图用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()".`,c++,macos,gcc,gdb,homebrew,C++,Macos,Gcc,Gdb,Homebrew,在浏览了互联网之后,我很难理解这个错误的含义,也很难找到解决问题的方法。围绕堆栈溢出还有一些其他类似的问题(和) 由于苹果的Xcode命令行工具已经过时(请参阅和问题),我需要使用自己的自制版本。我不知道这些工具的设置中是否有我可能错过的东西 我可以使用gdb从命令行进行调试,我遇到了相同的错误:“找不到”Class::method()“”的帧基,因此我非常确定Eclipse没有问题 是否有任何可能导致此问题的信息泄露给任何人 Mac OS X 10.8.5(山狮) Eclipse 4.2.1

在浏览了互联网之后,我很难理解这个错误的含义,也很难找到解决问题的方法。围绕堆栈溢出还有一些其他类似的问题(和)

由于苹果的Xcode命令行工具已经过时(请参阅和问题),我需要使用自己的自制版本。我不知道这些工具的设置中是否有我可能错过的东西

我可以使用gdb从命令行进行调试,我遇到了相同的错误:
“找不到”Class::method()“
”的帧基,因此我非常确定Eclipse没有问题

是否有任何可能导致此问题的信息泄露给任何人

  • Mac OS X 10.8.5(山狮)
  • Eclipse 4.2.1(朱诺)
  • gcc 4.8.2(自制)(带有
    -O0
    -g3
  • gdb 7.6.2(自制和代码设计)
更新:

我也看到了这句话:

BFD: /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork(i386:x86-64): unknown load command 0x20
随后是几次警告:

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: Could not open OSO archive file "/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/../src/c++11/.libs/libc++11convenience.a"
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/../src/c++98/.libs/libc++98convenience.a"
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-atomic-c++0x.o': can't open to read symbols: No such file or directory.
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-c++0x.o': can't open to read symbols: No such file or directory.
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-chrono.o': can't open to read symbols: No such file or directory.
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-debug_list-2.o': can't open to read symbols: No such file or directory.
...
谷歌搜索“gdb bfd unknown load command”揭示了许多没有任何解决方案的网站,但它们似乎都表明非苹果版本的gdb和Mac OS X 10.8+之间可能存在冲突


任何洞察都会有很大帮助!

这是因为名称有误。名称与GCC和Clang相同(它们通常共享类似的机制)。名称有误可以使C/C++方法和汇编过程具有相同的名称。请参阅C定义的情况:

void myfunc() {}
我们使用
nm
查看符号的二进制名称。使用
nm--demangle
查看未混合的名称。编译文件的nm输出为: ... 0000000000000000 T_myfunc ... 其他符号的数量取决于调试级别,请参阅GCC手册页中的-O和-g选项。正如我们所看到的,有一个数字。它是十六进制的。32位机器上有八位数字,64位机器上有十六位数字(因为n位CPU意味着n位代表指针,该符号实际上是二进制文件中的指针)。然后我们有了符号类型。现在只有两个值是有趣的:
T
是一个C/C++/…方法,
T
是一个汇编程序。如果我们编译以下汇编代码,看看会发生什么:

myproc:
编译程序集时,GCC和Clang不应推送调试符号,因此
nm
输出可能如下所示:

0000000000000000 t myproc
<>汇编程序名称不被加密。C++被损坏,非常奇怪。符号C++中不允许使用一些字符,如<代码>:<代码> >或<代码>,<代码>。编译此C++源:

namespace myspace { void myfunc() {} }
我们看到输出:

...
0000000000000000 T __ZN7myspace6myfuncEv
...
并且主方法名称永远不会损坏。如果我们有这样的名称:

int main(int argc, char** argv) {}
int main(std::vector<std::string> args) {}
intmain(intargc,char**argv){
int main(std::vector args){}

只有第二个名称被损坏。我认为这可能是问题所在。而且,这些警告没有任何意义。它们意味着系统重新编译时调试符号数较低。

我刚刚打开了一个类似的线程。我成功地使用了XCode 5.1,llvm gcc作为编译器,gcc 7.7.1作为调试器,但我仍然对回答如何解决这个问题。这里也有同样的问题。提前感谢所有能解决这个问题的人。我无论如何都不是专家,但你可以尝试使用-gdwarf-3标志编译,看看它是否有效,-g标志为解决我以前遇到的一些问题敲响了警钟。但是,可能没有任何包可以修复所有这些东西。”“如果这不是你所说的自制?出于好奇,你为什么不使用LLDB/Clang?”?至于最初的问题,您是如何安装GCC的,编译器调用是什么?我认为这与损坏无关。显然,调试符号不包含在mac os上的库中,这混淆了gdb。