我已经在 macOS 12.0 上从源代码构建了 GDB 并对其进行了代码签名。但是,每次我尝试调试程序时,都会出现以下情况:
(gdb) b main
Breakpoint 1 at 0x10000324f: file main.cpp, line 50.
(gdb) run
Starting program: /Users/tjcaul/Documents/C++/a.out
[New Thread 0x2a03 of process 2389]
然后 GDB 挂起。我一直在用 g++ 编译 C++ 程序。以下是我尝试过的一些方法:
- 使用 -g 选项进行编译。
- 使用 -ggdb 选项进行编译。
- 使用 -ggdb3 选项进行编译。
- 运行
sudo
- 反复终止并重新运行 gdb。
- 尝试不同的二进制文件。
- 禁用 SIP
- 添加更多断点。
set startup-with-shell off
在.gdbinit
我愿意不是获取任务门控/Mach 端口错误;仅新线程消息。
我意识到这是这,但我没有看到关于该问题的有效答案。
作为参考,以下是我的版本:
$ g++ --version
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin21.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ gdb --version
GNU gdb (GDB) 10.2
答案1
和往常一样,问题在于对细节的关注。我看到了g++ --version
报告clang
,但我没有充分考虑。我以为问题出在 GDB 上,而不是我的编译器上。我不确定 Apple 为什么将 g++ 与 clang++ 联系起来,因为这很容易让人误解。这个小疏忽让我花了 8 个月的时间在手机上编写 C++(60 个字符宽的显示器上的 vi 不是我理想的 IDE)。
我做了什么来获得真实的克++:
使用 Homebrew 安装 gcc
软链接 (
ln -s
) gcc-11 和 g++-11 从/usr/local/Cellar/
到/usr/local/bin/
unhash
(至少在 zsh 中)gcc 和 g++,否则gcc
将继续扩展到/usr/bin/clang
GDB 现在大部分时间都在工作。
答案2
这个挂起导致 gdb 错误:https://sourceware.org/bugzilla/show_bug.cgi?id=24069
您可以从该源安装带有补丁的 gdb:
brew install --force --build-from-source domq/gdb/gdb # a patched version based on 10.1
或者你可以
brew update
brew install gdb # use gdb 12.1
它对我有用,我通过以下链接找到了它:https://gist.github.com/mike-myers-tob/9a6013124bad7ff074d3297db2c98247