gdb失败,并显示“无法找到进程ID的Mach任务端口”错误


138

我的应用程序运行良好,但gdb无法调试并显示以下错误

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

我在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".

我认为这篇文章可能会有所帮助:stackoverflow.com/questions/10221448/…
科迪CodeMonkey 2012年

Answers:


64

在Snow Leopard和更高版本的Mac OS中,仅对代码进行签名是不够的 gdb可执行文件。

您必须按照本指南进行操作: http //www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

该指南说明了如何执行此操作lldb,但是该过程与完全相同gdb


12
这些说明对我和MacPorts在OSX 10.9.2上不起作用,但这确实适用:sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser 2014年

有用!但是您能解释一下sudo security add-trust生产线在做什么吗?.cer我现在可以从桌面删除文件吗?
Sreejith Ramakrishnan,2016年

9
codesign -s gdb_codesign `which gdb` 在本指南之后提供帮助
同步

sudo codesign -s gdb_codesign `which gdb-apple` 在macOS sierra上。
sdive

3
对于最新的操作系统,链接 有效
yuxuan

144

当我更改为时,它会起作用sudo gdb executableFileName!:)


2
谢谢。要使gdb正常工作,需要此代码加上代码签名。我给了gdb根访问权限(如此处stackoverflow.com/questions/10476154/…所述),因此我不必每次都键入sudo。编辑-在这里找到了更好的方法:stackoverflow.com/a/10441587/305149
Aneil Mallavarapu 2014年

14
以root身份运行吗?你是认真的吗?最糟糕的“解决方案”。
Equidamoid

7
@Equidamoid为什么gdb以root 身份运行会如此糟糕?我只是好奇,因为它只是调试器。
该用户需要帮助

如果您以root用户身份运行,会发生什么?这是您编写的代码,我不明白其结果
COLD ICE

4
@COLDICE通常,您不想运行具有升级特权(尤其是以root身份升级到顶部)的进程,因为通常它们不需要访问来修改系统上的内容或打开低于1024的端口(可以使用更高的端口由非系统/非root用户使用)。即使您“信任”自己的代码,也并不意味着您没有造成错误rm -rf /或类似的破坏,从而覆盖了计算机启动和正常运行所依赖的某些配置/二进制文件。
shaunhusain

32

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

  • 打开应用程序“钥匙串访问”(/ Applications / Utilities / Keychain Access.app)
  • 打开菜单/钥匙串访问/证书助手/创建证书...
  • 选择一个名称(在示例中为gdb-cert),将“身份类型”设置为“自签名根”,将“证书类型”设置为“代码签名”,然后选择“让我覆盖默认值”。点击“继续”。您可能希望将预定义的365天期限延长到3650天。
  • 在“继续”上单击几次,直到到达“指定证书的位置”屏幕,然后将“钥匙串设置为系统”。
  • 如果您不能将证书存储在“系统”钥匙串中,请在“登录”钥匙串中创建证书,然后将其导出。然后,您可以将其导入“系统”钥匙串。
  • 在钥匙串中,选择“系统”,您应该找到新证书。使用证书的上下文菜单,选择“获取信息”,打开“信任”项,并将“代码签名”设置为“始终信任”。
  • 您必须退出“钥匙串访问”应用程序才能使用证书并通过终止当前正在运行的“任务控制”进程来重新启动“任务控制”服务。或者,您可以重新启动计算机。
  • 最后,您可以对gdb进行签名:

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

    sudo ggdb ./myprog


4
请注意,杀死taskgated不会重新启动该过程。需要:sudo的launchctl负载/System/Library/LaunchDaemons/com.apple.taskgated.plist

上面重新启动的任务已完成-但遗憾的是,如果没有在sierra上重新启动,它仍然无法工作。
尼尔·麦吉尔

16

问题是您没有以root用户身份登录(不需要)。您需要为允许访问的gdb创建一个证书。遵循本教程,您应该会很好...

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

如果其他所有方法均失败,请使用: sudo gdb executableFileName


4
这里的教程效果最好。只需运行即可codesign -s gdb-cert $(which gdb)gdb应用程序进行签名。
cevaris 2015年

只需确认在OSX 10.12.5上尝试过此操作的任何人,您都必须遵循BuildingOnDarwin链接中概述的步骤,并在切换到root用户后运行gdb。
AdjunctProfessorFalcon

7

这个连结具有最清晰,最详细的逐步信息,以使该错误对我而言不再存在。

就我而言,我必须将密钥作为“系统”密钥,否则它将不起作用(并非每个URL都提到)。

还杀了 taskgated是替代重新启动的可行(且较快)的选择。

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


这对我有用。+1以供参考brew
trigoman

3

我需要此命令以使其在El Capitan上运行:

sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer


2

在MacOSX上,lldb需要进行代码签名。使用名为lldb_codesign的代码签名证书将Debug和Release版本设置为代码签名。

If you don't have one yet you will need to:
- Launch /Applications/Utilities/Keychain Access.app

- In Keychain Access select the "login" keychain in the "Keychains"
  list in the upper left hand corner of the window.

- Select the following menu item:

    Keychain Access->Certificate Assistant->Create a Certificate...

- Set the following settings

    Name = lldb_codesign
    Identity Type = Self Signed Root
    Certificate Type = Code Signing

- Click Continue
- Click Continue
- Click Done
- Click on the "My Certificates"
- Double click on your new lldb_codesign certificate
- Turn down the "Trust" disclosure triangle

    Change:
        When using this certificate: Always Trust

- Enter your login password to confirm and make it trusted

The next steps are necessary on SnowLeopard, but are probably because of a bug
how Keychain Access makes certificates.

- Option-drag the new lldb_codesign certificate from the login keychain to
  the System keychain in the Keychains pane of the main Keychain Access window
  to make a copy of this certificate in the System keychain.  You'll have to
  authorize a few more times, set it to be "Always trusted" when asked.
- Switch to the System keychain, and drag the copy of lldb_codesign you just
  made there onto the desktop.
- Switch to Terminal, and run the following:

sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/lldb_codesign.cer

- Right click on the "lldb_codesign" certificate in the "System" keychain (NOT
  "login", but the one in "System"), and select "Delete" to delete it from
  the "System" keychain.
- Reboot
- Clean and rebuild lldb and you should be able to debug.

That should do it.

[注意:-lldb在Mac中用作gdb。]


2

这是解决我的问题(OSX 10.13.6)的非常有用的指南

  1. 开放式钥匙串访问
  2. 在菜单中,打开钥匙串访问>证书助手>创建证书
  3. 给它起个名字(例如gdbc)
    • 身份类型:自签名根
    • 证书类型:代码签名
    • 检查:让我覆盖默认设置
  4. 继续,直到提示您输入:“指定位置...”
  5. 将钥匙串位置设置为系统
  6. 创建证书并关闭助手。
  7. 在系统钥匙串中找到证书,右键单击它>获取信息(或双击它)
  8. 展开信任,将代码签名设置为始终信任
  9. 在终端中重新启动taskgated:killall taskgated
  10. codesign -fs gdbc /usr/local/bin/gdb在终端中运行:这要求输入root密码

1

这些说明适用于OSX High Sierra,并避免以root用户身份运行gdb(真是糟糕!)。我最近从OSX 10.13.2更新到了10.3.3。我认为这是gdb 8.0.1(安装了Homebrew)开始对我失败的时候。

我在别人的指示上遇到困难。经过不同的指示,一切都变得一团糟。所以我开始了新鲜。我或多或少遵循了这些指示

清理烂摊子:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. Applications->Utilities ->中Keychain Access,我删除了所有以前的gdb证书和密钥(请确保您知道您在这里做什么!)。目前尚不清楚这是否必要,但是由于我想尝试使用其他说明来创建那些证书和密钥,所以无论如何我还是消除了它们。我在登录名和系统中都有密钥和证书。

现在重新安装gdb。

  1. brew install gdb
  2. 在中Keychain Access,转到菜单Keychain Access -> Certificate Assistant->Create a Certificate
  3. 选中“让我覆盖默认设置”并进行设置
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. 在“第一证书信息”页面上:
Serial Number : 1
Validity Period (days): 3650
  1. 在“第二证书信息”页面上,除已填写的字段外,所有字段均为空白。

  2. 在“密钥对信息”页面上,我保留了默认设置

Key Size : 2048
Algorithm : RSA
  1. 在“密钥用法扩展”页面上,我保留了默认设置。
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. 在“扩展密钥用法扩展”页面上,我保留了默认设置。
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. 在“基本约束扩展页面”上,未选中任何内容(默认)。

  2. 在“使用者备用名称扩展名”页面上,我保留了默认选项,并且未添加其他任何内容。

[X] Include Subject Alternate Name Extension
  1. 在“指定证书的位置”页面上,设置
Keychain: System
  1. 我单击创建,并提示输入密码。

  2. 回到Keychain Access应用程序中,我转到System并右键单击gdb-cert下拉菜单下的Trust,将所有字段更改为Always Trust

  3. 重新启动计算机。

  4. 在航站楼,我跑了 codesign -s gdb-cert /usr/local/bin/gdb。出现提示时,我输入了密码。

  5. 在航站楼,我跑了 echo "set startup-with-shell off" >> ~/.gdbinit

  6. 我先运行gdb myprogram,然后start在gdb控制台中运行。我相信这里会提示我输入密码。此后,所有后续运行均未提示输入密码。


可悲的是,我同时投票并回答了您的回答,但仍然看到相同的错误消息。我有macOS Catalina版本10.15.4和gdb 9.1。
杰伊·沙利文

@JaySullivan +1。我也有同样的问题。
irsis

1

这是一种奇怪的方法,但对我有用(MacOS HighSierra 10.13.3)。安装CLion。它带有gdb。一旦使用终端运行gdb。将gdb程序复制到您的usr / local / bin /中。没问题,sudo等。


1

按照此处的说明,对于我来说,在macOS High Sierra(10.13.3)上,macOS上的Codesign gdb似乎可以解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.