C++ &引用;请检查gdb是否进行了代码签名-请参阅taskgated(8)";-如何安装带有签名的自制代码的gdb?

C++ &引用;请检查gdb是否进行了代码签名-请参阅taskgated(8)";-如何安装带有签名的自制代码的gdb?,c++,eclipse,macos,gdb,homebrew,C++,Eclipse,Macos,Gdb,Homebrew,我在osx 10.8.4下,已经用自制软件安装了gdb 7.5.1(我得到了一个新的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 pr

我在osx 10.8.4下,已经用自制软件安装了gdb 7.5.1(我得到了一个新的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))
我遵循了关于代码签名的各种建议

  • 部分是各种各样的调整
所以我做了:

  • 设置证书
  • 签署gdb->codesign-s gdb证书/usr/local/bin/gdb
  • 当我在Eclipse中重新运行调试时,我得到了与上面相同的错误“(请检查gdb是否进行了代码签名-请参阅taskgated(8))”

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

    有什么解决方案/提示吗

    Thx


    Pelle

    我让gdb在OSX 10.9上工作,但没有以这种方式进行代码签名(如下所述):

  • 使用macports安装gdb。(也许你可以跳过它)

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

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

  • 重新启动计算机

  • 使用gdb。如果安装了mac端口,则必须使用
    ggdb
    命令。或在配置文件中创建别名:

  • 别名gdb='ggdb'


    然后使用“gdb”命令。

    我想知道中的全局更改是否有一些意外的后果

    taskgated并没有启用旧的Tiger约定,而是允许运行签名代码。因此,最好只获得gdb的签名证书,类似于


    在此之后,我能够
    sudo
    使用gdb。如果您需要使用不带sudo的gdb,那么也许,恕我直言,我还没有尝试过,因为现在使用
    sudo
    是一个不错的解决方案。 我在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))"
    
    但是,此错误消息是一条令人费解的消息

    我发现对我有效的解决方案是使用超级用户帐户调用GDB:

    sudo gdb sample.out. 
    
    这对我来说很好

    从那时起,我可以不使用sudo运行GDB example.out

    希望这对其他人有帮助。
    如果没有,请回复

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

    要创建代码签名证书,请打开密钥链访问应用程序。选择菜单Keychain Access->Certificate Assistant->创建证书

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

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

    重新启动taskgated服务,并对二进制文件进行签名

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

    在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
    
    资料来源:
    对于任何使用Sierra 10.12.6(及以上)和自制软件的人,
    /usr/local/bin/gdb
    是指向
    /usr/local/ceral/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安装coreutils
    安装):


    所有这些对我都不起作用,我不得不长期坚持下去。 下面是我为使其工作所做的全部步骤列表

  • 创建一个证书来签署gdb
  • 不幸的是,系统证书给了我
    Unknown Error=-2147414007
    ,这非常有用,所以我不得不采取一种变通方法。
    KeyChain助手->创建证书->

    选择
    登录
    gdb证书
    代码签名

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

  • 选择证书(
    gdb cert
    )单击
    Get info
    ->
    Trust Always
  • 使用shell禁用
    启动
  • 进入控制台:
    在外壳关闭时设置启动

    记住配置:
    echo“关闭外壳设置启动”>~/。gdbinit

  • 启用根用户
  • 转到
    系统首选项
    ->
    用户和组
    ->
    解锁
    ->
    登录选项
    ->
    网络帐户服务器
    ->
    加入
    ->
    解锁
    ->
    编辑
    (菜单)->
    启用根用户

  • sudo killall taskgated
  • 最后签署gdb
  • codesign-fs-gdb证书“$(哪个gdb)”

  • 禁用根用户(步骤4)
  • 如果仍然不工作,请重新启动。(如果其他方法都不起作用,很可能它已经起作用了)

  • 最后我使用了
    lldb
    ,因为它可以正常工作()

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

    def已安装lldb()
    codesign -fs gdb-cert $(which gdb)
    codesign -fs gdb-cert $(greadlink -f $(which gdb))
    
    codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
    
    <?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>
    
    codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
    
    ○ → 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};
    
    <!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>
    '''