简 述: 在 mac 使用 gdb 调试程序时候,会遇到报错如下,本文就是专门解决这个问题的。

(gdb) run
Starting program: /Users/muli/project/github/linuxExample/06_gdb/mainApp 
Note: this version of macOS has System Integrity Protection.
Because `startup-with-shell' is enabled, gdb has worked around this by
caching a copy of your shell.  The shell used by "run" is now:
    /Users/muli/Library/Caches/gdb/bin/zsh
Unable to find Mach task port for process-id 20050: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

在 MacOS 10.14.6 的系统下,发现安装 gdb 8.3 (当前最新) 的坑不是一般的多,那真真的多。鉴于网上的教程都是过时的,且按照某一篇, 你是不可能顺利运行安装成功的。所以浪费我昨天一个晚上解决这个问题(我的时间也很宝贵的),今天又花费一晚上时间,完成这篇图文并茂的的安装教程。作为一个日后的记录和给后来者一个方便。

是目前网上最新最详细的在 mac 安装 gdb 的教程 ;其中大概思路:

  • 创建整证书,证书授权
  • 关闭 SIP 安全防护,重启系统;
  • sudo 运行 gdb 调试;
  • kill 卡死进程, 再次重新 gdb 调试;
  • 成功

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


笔记本系统环境:

  💻: MacOS 10.14.6


查看是否安装 gdb:

  • 执行 brew search gdb ,搜索 brew 仓库:


命令 brew 安装 gdb:

  • 执行 brew install gdb 使用 brew 工具安装 gdb (默认最新),等待安装完毕;

  • 执行 which gdb 查看安装的路径为 /usr/local/bin/gdb

  • 执行 gdb -v 查看的 gdb 安装版本,版本为 8.3


创建系统证书:

  • 打开 钥匙串访问

  • 左上角进入 钥匙串访问 - 证书助理 - 创建证书

  • 创建证书, 名称随意,如 gdb_codesigned ,其中选择为 自签名根证书代码签名 ,还有✅ 让我覆盖这些默认值

  • 后面一路点击下一步,不用做任何修改 ,贴出来中间的过程图

  • 一直到这步骤,进行修改,选择 “系统 “,

  • 证书创建成功 (若是失败,参考下面解决方案)


修改证书:

  • 双击 证书打开, 勾选使用 始终信任 ,然后关闭此此窗口,会自动保存修改


对证书授权:

  • 执行 codesign -fs gdb_codesigned /usr/local/bin/gdb 命令,给证书授权;在执行 echo "set startup-with-shell off" >> ~/.gdbinit关闭 MacOS 系统的 SIP 安全验证 ;设置完这咯爱那个步骤后, 要重启电脑 ,使得配置生效。

    codesign -fs gdb_codesigned /usr/local/bin/gdb
    echo "set startup-with-shell off" >> ~/.gdbinit

验证 gdb 证书创建,关闭 SIP 成功:

  • 使用一个小的 c++ 项目测试下,下载地址,执行 g++-9 *.cpp -o mainApp -g 生成可调试的可执行程序 mainApp ,然后运行 sudo gdb mainApp



期间可能会遇到的奇怪的问题?

遇到证书创建失败?

  • 若是失败,看到下图提示:

  • 解决方法:则重头创建一次系统证书,最后这一步选择 “登录” ,编绘创建成功。

  • 且证书创建成功后,需要手动将其从登录区域, 移动到系统区域


遇到 Unable to find Mach task port for process-id 2358: (os/kern) failure (0x5).

  • 出现如下如下代码: Unable to find Mach task port for process-id 2358: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))

  • 解决方法:按下 control + z 退出终端使用 sudo 权限 ,运行命令 sudo gdb mainApp 调试


遇到 [New Thread 0x1303 of process 971] 卡死:

  • 出现如下代码 [New Thread 0x1303 of process 971] 代码,被进程被卡死(通常第一次会遇到这个问题)


  • 解决方法:按下 control + z 退出终端,执行 killall 2415 杀死该进程;然后再次运行 sudo gdb mainApp 调试, 按下 r 调试。


一些必须注意点:

  • 执行命令时候,证书生效,有的带 -f 参数;
  • 命令 codesign -fs gdb_codesigned /usr/local/bin/gdb 时候,gdb_codesigned 要换成你的证书名称
  • 有的证书博客证书的起名称为 gdb_cert, 但是命令 和终端截图为 gdb-cert; 注意短杠
  • 另外一个是 dgb 最好需要带绝对路径,避免找不到;
  • 看完这篇教程,一定要点赞

参考博客:

在macOS10.14上使用GDB的教程

macbook创建自签名根证书失败,怎么办?

mac book上安装和使用gdb

Tips:如何优雅的使用GDB调试Go

解决GDB在Mac下不能调试的问题

MAC OSX系统使用gdb编译程序时的报错处理

macOS High Sierra下无法使用gdb的解决办法