我通过brew install gdb
得到了gdb。
源文件内容为:
#include <cstdio>
int main(){
int a = 10;
for(int i = 0; i< 10; i++){
a += i;
}
printf("%d\n",a);
return 0;
}
这是名为“ demo”的可执行文件: https://pan.baidu.com/s/1wg-ffGCYzPGDI77pRxhyaw
我这样编译源文件:
c++ -g -o demo demo.cpp
并运行gdb
gdb ./demo
但是,它不起作用。无法识别可执行文件。
GNU gdb (GDB) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin18.0.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
"/Users/xxx/Codes/demo": not in executable format: file format not recognized
我使用file demo
,其输出为demo: Mach-O 64-bit executable x86_64
我使用file ./demo
,其输出为./demo: Mach-O 64-bit executable x86_64
类型c++ -v
,输出为:
Apple LLVM version 10.0.0 (clang-1000.10.44.2)
Target: x86_64-apple-darwin18.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
运行./demo
,其输出为55
在gdb中输入show configuration
,它显示:
This GDB was configured as follows:
configure --host=x86_64-apple-darwin18.0.0 --target=x86_64-apple-darwin18.0.0
--with-auto-load-dir=:${prefix}/share/auto-load
--with-auto-load-safe-path=:${prefix}/share/auto-load
--with-expat
--with-gdb-datadir=/usr/local/Cellar/gdb/8.2/share/gdb (relocatable)
--with-jit-reader-dir=/usr/local/Cellar/gdb/8.2/lib/gdb (relocatable)
--without-libunwind-ia64
--without-lzma
--without-babeltrace
--without-intel-pt
--disable-libmcheck
--without-mpfr
--with-python=/System/Library/Frameworks/Python.framework/Versions/2.7
--without-guile
--with-separate-debug-dir=/usr/local/Cellar/gdb/8.2/lib/debug (relocatable)
谁可以帮助我?非常感谢!!!
答案 0 :(得分:11)
问题在于,与clang-1000.11.45.2
一起分发的Apple LLVM version 10.0.0
向名为LC_BUILD_VERSION
的o-mach可执行文件添加了新的加载命令。
$ otool -l test.o
...
Load command 1
cmd LC_BUILD_VERSION
cmdsize 24
platform macos
sdk n/a
minos 10.14
ntools 0
...
来自苹果source:
/*
* The build_version_command contains the min OS version on which this
* binary was built to run for its platform. The list of known platforms and
* tool values following it.
*/
因此,当前bfd
(gdb用于操纵可执行程序的程序)无法解释此命令,并返回错误。
我找到的临时解决方案是直接编辑bfd
提供的gdb
源。
我只测试了gdb-8.0.1
。
首先,从mirrors下载gdb-8.0.1
源。然后将以下代码添加到gdb-8.0.1/bfd/mach-o.c
第4649
行:
case BFD_MACH_O_LC_BUILD_VERSION:
break;
最后添加int gdb-8.0.1/include/mach-o/loader.h
:
BFD_MACH_O_LC_BUILD_VERSION = 0x32
第189
行(不要忘记在,
之后的第188行末添加BFD_MACH_O_LC_VERSION_MIN_WATCHOS = 0x30
)。
按照这些说明操作后,您可以按照自述文件中的指示进行经典的gdb
编译:
run the ``configure'' script here, e.g.:
./configure
make
To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
make install
别忘了像解释here一样签署gdb
。
如果仍然出现(os / kern)故障(0x5)错误,只需运行sudo gdb
。
这是一个临时解决方案,等待GNU团队直接在存储库中解决问题。
编辑
Binutils-gdb
已更新,现在在提交fc7b364中实现了这些更改。
希望这会有所帮助。
答案 1 :(得分:2)
我在等待官方酿造公式更新的同时发布了一个似乎有效的临时酿造公式:
简单安装https://raw.githubusercontent.com/timotheecour/homebrew-timutil/master/gdb_tim.rb
答案 2 :(得分:1)
升级到GDB版本8.3。另请参见Binutils错误跟踪器中的Issue 23728, binutils fail on macOS 10.14 (Mojave) due to unimpl。
来自bug report:
我找到了问题的根源。 binutils无法处理负载 命令0x32 LC_BUILD_VERSION(实际上也不是0x31 LC_NOTE)。他们是 在最新的LLVM版本中定义:请参阅 https://github.com/llvm-mirror/llvm/blob/master/include/llvm/BinaryFormat/MachO.def#L77
看objdump -private-headers的输出,有一个清晰的 区别:
@@ -56,16 +56,18 @@ attributes NO_TOC STRIP_STATIC_SYMS LIVE reserved1 0 reserved2 0 Load command 1 - cmd LC_VERSION_MIN_MACOSX - cmdsize 16 - version 10.13 - sdk n/a + cmd LC_BUILD_VERSION + cmdsize 24 + platform macos + sdk n/a + minos 10.14 + ntools 0 Load command 2 cmd LC_SYMTAB cmdsize 24
LC_VERSION_MIN_MACOSX在binutils中实现,而 LC_BUILD_VERSION不是。它显然是莫哈韦沙漠中的新事物。
答案 3 :(得分:0)
我从堆栈溢出中得到了一个很好的解决方案,但我不知道它为什么起作用。 这是link。
我是macOS的新手,并且执行以下操作:
BFD: /Users/xxx/Codes/demo: unknown load command 0x32
而死Unknown Error -2,147,414,007
。
通过在
Login
中获取证书来解决此问题,然后将其导出并导入到System
中(如果无法导入,请从“登录名”中删除它。)
ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". Unable to find Mach task port for process-id 1510: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
附带了how to undo codesign,据错误消息仍然存在,答案告诉我brew reinstall gdb
,但是它仍然无法正常工作,我昨天才打电话给它。希望我的解决方案可以提供帮助。
答案 4 :(得分:0)
我通过以下方式使gdb在Mojave上工作:
a)获取最新的gdb源档案(在撰写本文时,ftp://sourceware.org/pub/gdb/snapshots/current/gdb-weekly-8.2.50.20190212.tar.xz)-除其他外,它增加了在Mac上识别可执行文件的处理。
b)建立gdb。在darwin-nat.c中出现变量阴影错误,因此我编辑了文件并重新构建。
c)遵循https://forward-in-code.blogspot.com/2018/11/mojave-vs-gdb.html
中的步骤Voila。
(来源:GDB on Mac/Mojave: During startup program terminated with signal ?, Unknown signal)
答案 5 :(得分:0)
gdb 8.2与Mac mojave不兼容。 我已经升级到8.2.1。该问题应得到解决。
答案 6 :(得分:0)
上面timotheecour的回答对我有用:
简单安装https://raw.githubusercontent.com/timotheecour/homebrew-timutil/master/gdb_tim.rb
然后我必须生成一个生成自签名证书,如 https://www.thomasvitale.com/how-to-setup-gdb-and-eclipse-to-debug-c-files-on-macos-sierra/
答案 7 :(得分:-3)
通过精简应用程序,我克服了Mojave上的这个问题。 GDB不了解通用二进制文件。因此,如果file myapp
告诉您myapp是通用二进制文件,请尝试以下操作:
lipo -thin x86_64 -output myapp-x86_64 myapp
然后
gdb myapp-x86_64