"请检查gdb是否为codesigned - 请参阅taskgated(8)" - 如何使用自制程序代码签名安装gdb?

pel*_*olt 93 c++ eclipse macos homebrew gdb

我在osx 10.8.4下并且已经安装了gdb 7.5.1和homebrew(动机获得了一个新的gdb,其新功能如--with-python等...)

长话短说,我在c ++ Eclipse项目中运行调试得到:

Error in final launch sequence
Failed to execute MI command:
-exec-run
Error message from debugger back end:
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
Run Code Online (Sandbox Code Playgroud)

我已经遵循了代码签名的各种建议

所以我做了:

  1. 设置证书
  2. 签署gdb - > codesign -s gdb-cert/usr/local/bin/gdb

当我在Eclipse中重新运行调试时,我得到与上面相同的错误"(请检查gdb是codesigned - 参见taskgated(8))".

如果我将gdb设置回较旧的gdb(在Eclipse的gdb首选项中)/ usr/libexec/gdb/gdb-i386-apple-darwin,则调试按预期运行.

那里有任何解决方案/提示吗?

谢谢

佩尔

小智 127

发生此错误是因为OSX实现了pid访问策略,该策略需要二进制文件的数字签名才能访问其他进程pids.要启用gdb访问其他进程,我们必须首先对二进制文件进行代码签名.此签名取决于特定证书,用户必须创建该证书并向系统注册.

要创建代码签名证书,请打开Keychain Access应用程序.选择菜单Keychain Access - > Certificate Assistant - > Create a Certificate ...

选择证书的名称(例如,gdb-cert),将Identity Type设置为Self Signed Root,将Certificate Type设置为Code Signing并选择Let me override defaults.在"继续"上单击几次,直到进入"为证书指定位置"屏幕,然后将"密钥链"设置为"系统".

双击证书,打开"信任"部分,然后将"代码签名"设置为"始终信任".退出Keychain Access应用程序.

重新启动taskgated服务,并签署二进制文件.

$ sudo killall taskgated
$ codesign -fs gdb-cert "$(which gdb)"
Run Code Online (Sandbox Code Playgroud)

来源http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/

在macOS 10.12(Sierra)及更高版本中,您还必须

使用gdb 7.12.1或更高版本另外防止gdb使用shell启动要调试的程序.你可以在gdb里面使用以下命令:

set startup-with-shell off
Run Code Online (Sandbox Code Playgroud)

您还可以将此最后一个命令放在主目录中名为.gdbinit的文件中,在这种情况下,每次启动gdb时都会自动应用它

echo "set startup-with-shell off" >> ~/.gdbinit
Run Code Online (Sandbox Code Playgroud)

消息来源:https: //sourceware.org/gdb/wiki/BuildingOnDarwin

  • 如果我用"sudo"运行gdb,这对我有用. (17认同)
  • 正如OP指出的那样,这对他来说并没有成功(对我来说也没有). (11认同)
  • 奇迹般有效.谢谢. (5认同)
  • 任何解决方法都不必使用sudo? (5认同)
  • 它似乎不适用于带有自签名证书的`macOS Sierra`. (5认同)
  • 对于较新版本的 macOS,这个答案现在已经过时了;您还必须创建 gdb-entitlement.xml 并使用 --entitlements gdb-entitlement.xml 运行协同设计。您能否使用消息“macOS 10.14 及更高版本需要其他步骤,请参阅 https://sourceware.org/gdb/wiki/PermissionsDarwin”更新此答案,或者将有关 gdb-entitlement.xml 的其他信息从该页面复制到这个答案? (5认同)
  • 执行 https://sourceware.org/gdb/wiki/PermissionsDarwin 第 1 节中的所有步骤为我解决了 macOS Catalina(版本 10.15.4)上的问题。 (4认同)

Joh*_*man 54

我升级到gdb 8.3并且无法使事情正常工作。这帮助了我:

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
Run Code Online (Sandbox Code Playgroud)

其中的内容gdb.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.allow-dyld-environment-variables</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
    <key>com.apple.security.get-task-allow</key>
    <true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

我在这里找到了这个解决方案:https : //timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

注意:如果没有权利,我gdb只能使用sudo.

  • 如果收到“错误:在钥匙串中找不到指定的项目”,您该怎么办? (3认同)

klm*_*123 30

我让gdb在OSX 10.9上工作,没有这样的编码方式(这里描述):

  1. 用macports安装gdb.(也许你可以跳过它)

  2. sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist

    从更改选项字符串-s,以-sp在22行,列27.

  3. 重启电脑.

  4. 使用gdb.如果您使用mac ports安装它,那么您必须使用'ggdb'命令.或者在配置文件中创建别名:

别名gdb ='ggdb'

然后使用'gdb'命令.

  • 这只有在我使用"sudo"运行gdb时才有效. (8认同)
  • Not going to restart the computer. There must be a command to restart something! (2认同)

小智 24

我在GDB遇到了同样的问题.我在Mac OS X 10.8.5又名Mountain Lion 下奔跑.我正在使用GDB版本7.7.1.

我使用以下命令编译了我的测试程序:

g++ -o gdb-sample.out -g gdb-sample.cpp    
Run Code Online (Sandbox Code Playgroud)

如果我输入命令gdb sample.out,我会收到相同的神秘错误消息:

"Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))"
Run Code Online (Sandbox Code Playgroud)

但是,此错误消息是一个红色的鲱鱼.

我发现对我有用的解决方案是使用超级用户acct简单地调用GDB:

sudo gdb sample.out. 
Run Code Online (Sandbox Code Playgroud)

这对我来说很好.

从那时起,我可以在不使用sudo的情况下运行GDB example.out.

希望这有助于并为其他人服务.如果没有,请回复.

  • 不知道为什么这被否决了。我以 root 身份运行命令(使用 sudo)并且它起作用了。 (2认同)

Tar*_*syk 9

这些都不适合我,我不得不长期坚持下去。这是我为使其正常工作所做的步骤的完整列表。

  1. 创建一个证书来签署 gdb。

不幸的是,系统证书给了我Unknown Error = -2,147,414,007很大帮助,所以我不得不采取一种解决方法。 KeyChain Assistant -> Create certificate ->

选取login, gdb-cert,Code Signing

将证书复制/移动到系统钥匙串(输入密码)

  1. 选择证书 ( gdb-cert) 单击Get info->Trust Always
  2. 禁用 startup-with-shell

在控制台输入: set startup-with-shell off

记住配置: echo "set startup-with-shell off" >> ~/. gdbinit

  1. 启用根用户

System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(菜单) ->Enable Root User

  1. sudo killall taskgated
  2. 最后签署gdb

codesign -fs gdb-cert "$(which gdb)"

  1. 禁用根用户(步骤 4)
  2. 如果仍然不起作用,请重新启动。(如果没有其他工作,很可能它已经工作了)

附注。我最终使用了lldb因为它很好用(教程


Lar*_*ong 7

对于使用 Sierra 10.12.6(及更高版本)和 Homebrew 的任何人来说,/usr/local/bin/gdb是一个符号链接/usr/local/Cellar/gdb/8.0/bin/gdb(或任何版本,例如8.0.1)。

您需要对链接和目标进行协同设计:

codesign -fs gdb-cert /usr/local/bin/gdb
codesign -fs gdb-cert "/usr/local/Cellar/gdb/8.0/bin/gdb"
Run Code Online (Sandbox Code Playgroud)

或者,如果您有greadlink(通过 安装brew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))
Run Code Online (Sandbox Code Playgroud)


小智 5

这可能没有关系。您可以在 macos 上使用 lldb 而不是 gdb。你不需要这个麻烦来安装 gdb。

lldb( http://lldb.llvm.org ) 已经默认安装在 High Sierra 中