gdb失败,出现"无法找到process-id的Mach任务端口"错误

S B*_*S B 132 macos gdb

我的应用程序运行正常,但gdb无法调试它与以下错误

(gdb) run
Starting program: /path/to/app 
Unable to find Mach task port for process-id 83767: (os/kern) failure (0x5).
Run Code Online (Sandbox Code Playgroud)

我在OS X Lion上.GDB版本是

$ gdb --version
GNU gdb 6.3.50-20050815 (Apple version gdb-1752) (Sat Jan 28 03:02:46 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".
Run Code Online (Sandbox Code Playgroud)

小智 128

它改变的时候有效sudo gdb executableFileName!:)

  • 以root身份运行?你是认真的吗?最糟糕的"解决方案". (12认同)
  • @Equidamoid为什么以root身份运行`gdb`会如此糟糕?我只是好奇,因为它只是一个调试器. (7认同)
  • @COLDICE一般来说你不希望运行具有升级权限的进程(特别是以root身份升级到顶层),因为通常他们不需要访问来修改系统上的东西或打开低于1024的端口(更高的端口可以是非系统/非root用户使用).即使你"信任"你自己的代码,也不意味着你没有犯错,导致它变成`rm -rf /`或类似破坏性的东西你覆盖你的计算机依赖启动的一些配置/二进制文件并正常运作. (3认同)
  • 谢谢.需要使用此代码签名才能使gdb正常工作.我给了gdb root访问权限(如http://stackoverflow.com/questions/10476154/how-do-i-grant-root-access-to-a-user-application所述)所以我没有输入sudo每一次.编辑 - 在这里找到了更好的方法:http://stackoverflow.com/a/10441587/305149 (2认同)

Tyi*_*ilo 58

在Snow Leopard和后来的Mac OS版本中,仅对gdb可执行文件进行编码是不够的.

您必须遵循本指南才能使其正常工作:http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

该指南解释了如何做到这一点lldb,但过程完全相同gdb.

  • 这些说明在Mac OS OSX 10.9.2上对我不起作用,但是这样做了:https://sourceware.org/gdb/wiki/BuildingOnDarwin (10认同)
  • ``codesign -s gdb_codesign` gdb```在本指南之后提供帮助 (8认同)
  • 遵循指南:codesign -s gdb_codesign gdb/gdb (5认同)
  • 当我第一次读到这个答案时,我将“协同设计”读作“协同设计”,并且非常困惑,直到我意识到它的意思是“代码签名”。 (4认同)
  • 对于最新的操作系统,[link](https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt)工作 (3认同)

qed*_*qed 31

您需要创建证书并签署gdb:

  • 打开应用程序"Keychain Access"(/ Applications/Utilities/Keychain Access.app)
  • 打开菜单/钥匙串访问/证书助理/创建证书...
  • 选择一个名称(示例中为gdb-cert),将"Identity Type"设置为"Self Signed Root",将"Certificate Type"设置为"Code Signing"并选择"Let me override defaults".点击"继续".您可能希望将预定义的365天期限延长至3650天.
  • 在"继续"上单击几次,直到进入"为证书指定位置"屏幕,然后将"钥匙串设置为系统".
  • 如果您无法将证书存储在"系统"钥匙串中,请在"登录"钥匙串中创建,然后将其导出.然后,您可以将其导入"系统"钥匙串.
  • 在钥匙串中选择"系统",您应该找到新的证书.使用证书的上下文菜单,选择"获取信息",打开"信任"项,并将"代码签名"设置为"始终信任".
  • 您必须退出"Keychain Access"应用程序才能使用证书并通过终止当前运行的"taskgated"进程来重新启动"taskgated"服务.或者,您可以重新启动计算机.
  • 最后你可以签署gdb:

    sudo codesign -s gdb-cert /usr/local/bin/ggdb

    sudo ggdb ./myprog

  • 注意kill taskgated没有重启过程.需要:sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist (4认同)

小智 15

问题是您没有以root用户身份登录(您不想要).您需要为gdb创建一个允许访问的证书.按照本教程,你应该好好去......

http://sourceware.org/gdb/wiki/BuildingOnDarwin

如果所有其他方法都失败了,只需使用:sudo gdb executableFileName

  • 这里的教程是最好的.只需要运行`codesign -s gdb-cert $(gdb)`来签署`gdb`应用程序. (4认同)

Han*_*man 7

这个链接有一个最清晰,最详细的步骤,让这个错误消失了.

在我的情况下,我必须将密钥作为"系统"密钥,否则它不起作用(并非每个网址都提到).

杀戮taskgated也是必须重启的可行(且更快)的替代方案.

在开始此过程之前我还卸载了MacPorts并使用了卸载当前的gdb brew uninstall gdb.