“请检查gdb是否已进行代码签名-请参阅taskgated(8)”-如何安装带有自制代码签名的gdb?


107

我在osx 10.8.4下安装了带有自制软件的gdb 7.5.1(动机是使用新功能(如--with-python等)获得新的gdb)

长话短说,当我在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))

我遵循了各种有关代码签名的建议

所以我做了:

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

当我在Eclipse中重新运行调试程序时,出现与以上相同的错误“(请检查gdb是否已进行代码签名-请参阅taskgated(8))”。

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

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

谢谢

佩尔


这不是“安全功能”吗?换句话说,您的系统配置为仅接受经过正式签名的软件?如果是这样,希望有一种方法可以关闭该功能...
Mats Petersson

好的,谢谢您的反馈-我理解您的安全功能点,但是我的问题是然后如何进行签名...类似的文章stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion却没有尚未为我解决问题
pellekrogholt 2013年

Answers:


136

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

要创建代码签名证书,请打开“钥匙串访问”应用程序。选择菜单钥匙串访问->证书助手->创建证书...

选择证书的名称(例如gdb-cert),将“身份类型”设置为“自签名根”,将“证书类型”设置为“代码签名”,然后选择“让我覆盖默认值”。在“继续”上单击几次,直到进入“指定证书的位置”屏幕,然后将“钥匙串”设置为“系统”。

双击证书,打开“信任”部分,然后将“代码签名”设置为“始终信任”。退出钥匙串访问应用程序。

重新启动任务服务,并签名二进制文件。

$ sudo killall taskgated
$ codesign -fs gdb-cert "$(which gdb)"

来源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

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

echo "set startup-with-shell off" >> ~/.gdbinit

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


6
奇迹般有效。谢谢。
pceccon

14
正如OP所指出的那样,这对他(对我而言)都不起作用。
PVitt

6
似乎不适macOS Sierra用于自签名证书。
loretoparisi

sudo killall taskgated是解决我的问题的关键
Karthikeyan Vaithilingam

我严格按照步骤进行操作,这在macOS Sierra上对我来说效果很好。
jdg

29

我使gdb在OSX 10.9上工作,而没有使用这种方式对代码进行签名(此描述):

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

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

    将第22行第27行的选项字符串从更改-s-sp

  3. 重新启动计算机。

  4. 使用gdb。如果使用Mac端口安装了它,则必须使用ggdb命令。或在您的配置文件中添加别名:

alias gdb='ggdb'

然后使用“ gdb”命令。


我已经有一段时间遇到这个问题了,发现其他方法无济于事。这就像一个魅力。
Bill DeRose 2013年

@BillDeRose,对我来说也是一样。
klm123 2013年

@nimrodm,您的意思是“ sudo gdb”吗?它应该是具有
Macports的

1
啊。我不希望有运行gdbsudo。这似乎是不必要的安全风险。
Autumnsault 2014年

2
不打算重新启动计算机。必须有一个命令来重启某些东西!
2014年

27

我升级到了gdb 8.3,但无法使工作正常。这对我有帮助:

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb

其中的内容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>

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

注意:没有授权,我gdb只能使用来运行sudo


2
如果得到您该怎么办error: The specified item could not be found in the keychain.
Sridhar Sarnobat

@SridharSarnobat使用此答案首先的管道stackoverflow.com/a/32727069/339146
Panayotis

尝试@maximser的答案后失败。然后这对我有用。通过brew安装macOS 10.15.4,gdb 9.2。
脱衣

@SridharSarnobat:您必须先创建证书 stackoverflow.com/questions/35020236/...
Akansha

26

我在GDB上遇到了同样的问题。我Mac OS X 10.8.5又名“山狮” 奔跑。我正在使用GDB版本7.7.1

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

g++ -o gdb-sample.out -g gdb-sample.cpp    

如果输入命令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))"

但是,此错误消息是红色鲱鱼。

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

sudo gdb sample.out. 

对我来说很好。

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

希望这会有所帮助并为他人服务。如果没有,请回复。


1
不知道为什么这被否决。我以root身份(使用sudo)运行了命令,并且该命令有效。
iProgram 2015年

6

这些都不对我有用,我必须长期坚持下去。这是我为使其正常运行而完成的步骤的完整列表。

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

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

匹克logingdb-certCode 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. 如果仍然无法启动,请重新启动。(如果没有其他方法起作用,则很可能已经起作用)

PS。我最终使用了lldb它,因为它可以正常工作(教程


5

对于使用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"

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

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))

1
您在High Sierra上尝试了吗?它对我的操作系统
不起作用

3

我不知道这里投票率最高的答案的全球变化是否会带来一些意想不到的后果。

Taskgated并没有启用旧的Tiger约定,而是允许运行签名的代码。因此,最好为gdb获取签名证书,类似于此处答案

之后,我可以sudo使用gdb了。如果您需要使用不带sudo的gdb,那么此链接也许会有所帮助,免责声明,我还没有尝试过,因为使用sudo暂时是一个好的解决方案。


3

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

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


0

我可以建议遵循以下要点:https : //gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

需要克服的技巧:unknown error = -2,147,414,007在此处描述的证书创建过程中:https : //apple.stackexchange.com/a/309123

笔记:

将gdb作为homebrew软件包安装的路径应类似于:/usr/local/Cellar/gdb/9.2/bin/gdb

csrutil enable --without debug会引起有关的消息requesting unsupported configuration,例如:https : //totalfinder.binaryage.com/system-integrity-protection

测试:

  sw_vers -productVersion
10.13.6

  gdb ./a.out
GNU gdb (GDB) 9.2
...
Thread 3 hit Breakpoint 1, main () at main.c:14
14          data_t d = {0};

-1

gdb 8.3;

我的问题和上面的那个家伙一样,解决了

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/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.