【问题标题】:How do I get a homebrewed version of GDB working on Mac OS X?如何获得在 Mac OS X 上运行的自制版本的 GDB?
【发布时间】:2014-02-28 16:20:35
【问题描述】:

我正在尝试使用 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()".`

在网上搜索之后,我很难理解这个错误的含义或找出解决问题的方法。 Stack Overflow 周围还有一些其他类似的问题(herehere)。

由于 Apple 的 Xcode 命令行工具非常过时(请参阅 gccgdb 问题),我需要使用我自己的自制版本。我不知道这些工具的设置中是否有我可能遗漏的东西。

我可以使用 gdb 从命令行进行调试,但遇到了同样的错误:"Could not find the frame base for "Class::method()",所以我很确定这不是 Eclipse 的问题。

是否有任何事情会引起任何人的注意,这可能会导致这个问题?

  • Mac OS X 10.8.5(山狮)
  • Eclipse 4.2.1 (Juno)
  • 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+之间可能存在冲突。

任何见解都会大有帮助!

【问题讨论】:

  • 我刚刚打开了一个关于类似stackoverflow.com/questions/24414707 的帖子。我已经成功使用 XCode 5.1 和 llvm-gcc 作为编译器和 gcc 7.7.1 作为调试器,但我仍然对如何解决这个问题的答案感兴趣。
  • 这里有同样的问题。提前感谢任何可以解决它的人。
  • 我不是专家,但您可以尝试使用 -gdwarf-3 标志进行编译,看看它是否有效。
  • -g 标志敲响了修复我以前遇到的一些问题的钟声。但是,是否没有可用的软件包来修复所有这些东西,如果这不是您所说的自制的话,也许是“brew.sh”?
  • 出于好奇,您为什么不使用 LLDB/Clang?至于原来的问题,你是怎么安装GCC的,编译器调用是什么?

标签: c++ macos gcc gdb homebrew


【解决方案1】:

这是因为名称损坏。名称与 GCC 和 Clang 相同(它们通常共享相似的机制)。名称修改使 C/C++ 方法和程序集过程具有相同的名称。看看 C 定义会发生什么:

void myfunc() {}

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

myproc:

GCC 和 Clang 在编译 Assembly 时不应推送调试符号,因此 nm 的输出可能如下所示:

0000000000000000 t myproc

程序集过程名称未损​​坏。 C++ 被破坏了,非常奇怪。符号名称中不允许使用某些字符,例如 :,。编译这个 C++ 源代码:

namespace myspace { void myfunc() {} }

我们看到输出:

...
0000000000000000 T __ZN7myspace6myfuncEv
...

并且主方法名称永远不会被破坏。如果我们有这样的:

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

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

【讨论】:

  • 我认为这与修改无关。显然调试符号不包含在 mac os 上的库中,这使 gdb 感到困惑。
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2015-03-20
  • 2014-12-14
  • 2013-07-01
  • 1970-01-01
相关资源
最近更新 更多