简 述: 在 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 最好需要带绝对路径,避免找不到;
- 看完这篇教程,一定要点赞
参考博客: