156

我的应用程序运行良好,但 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".
4

12 回答 12

153

当我更改为sudo gdb executableFileName! :)

于 2014-01-12T21:50:35.687 回答
75

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

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

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

于 2013-03-19T23:12:03.750 回答
33

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

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

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

    sudo ggdb ./myprog

于 2014-10-17T18:47:23.683 回答
17

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

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

如果一切都失败了,只需使用:sudo gdb executableFileName

于 2012-12-30T21:18:59.090 回答
7

这个链接有最清晰和最详细的一步一步让这个错误对我来说消失。

在我的情况下,我必须将密钥作为“系统”密钥,否则它不起作用(不是每个 url 都提到)。

杀死taskgated也是一种可行(且更快)的替代方法,而不必重新启动。

在开始此过程之前,我还卸载了 MacPortsbrew uninstall gdb ,并使用.

于 2014-02-01T15:21:34.647 回答
3

我需要这个命令来使它在 El Capitan 上工作:

sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer
于 2016-01-10T19:50:44.103 回答
2

我按照教程进行操作,一切正常。

于 2014-08-27T01:27:28.460 回答
2

在 MacOSX 上,lldb 需要进行代码签名。调试和发布版本设置为使用名为 lldb_codesign 的代码签名证书进行代码签名。

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。]

于 2016-08-21T10:40:05.630 回答
2

这是一个非常有用的指南,它解决了我的问题(OSX 10.13.6)。

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

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

我很难接受别人的指示。在不同的指示之后,一切都变得一团糟。于是我开始了新鲜。我或多或少地遵循了这些指示

清理烂摊子:

  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 Pair Information 页面上,我保留了默认值

Key Size : 2048
Algorithm : RSA
  1. 在 Key Usage Extension 页面上,我选中了默认值。
[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 控制台中。在这里,我相信它提示我输入密码。之后,所有后续运行,它都没有提示我输入密码。

于 2018-01-31T19:58:31.127 回答
1

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

于 2018-03-21T20:57:25.693 回答
1

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

于 2018-03-29T15:50:29.923 回答