副标题:Mac上的gdb没法正常调试的问题
shell
Mac上用brew install gdb
安装gdb后,没法正常的运行run
命令,报错以下:macos
(gdb) break main Breakpoint 1 at 0x100000f66: file a.c, line 4. (gdb) run Starting program: /Users/solomonxie/Workspace/tests/clang/a Unable to find Mach task port for process-id 63414: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))
这个不是c程序的问题,也不是gdb的问题,而是Mac的问题。vim
参考:gdb doesn't work on macos High Sierra 10.13.3api
为何Mac不能调试?安全
"由于 Darwin 内核在你没有特殊权限的状况下,不容许调试其它进程。调试某个进程,意味着你对这个进程有彻底的控制权限,因此为了防止被恶意利用,它是默认禁止的。容许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名。"
参考:gdb fails with “Unable to find Mach task port for process-id” error
参考:How to install and codesign GDB on OS X El Capitan服务器
具体步骤以下:app
用Spotlight搜索Directory Utility
程序,打开后,点击左下角解锁,而后打开菜单->Edit->Enable root user
->建立密码。ide
/System/Library/LaunchDaemon/com.apple.atrun.plist
文件将第22行的-s
改成-sp
而后保存退出。学习
通常来说管理员是没有权限修改的,因此须要重启进入“安全模式”用root权限解开系统文件的保护,再重启,修改文件,再重启进入安全模式,再开启系统文件保护,再重启回到正常系统。
步骤为:
重启,黑屏时按住Ctrl-r
不松手一直到苹果标志出现。进入安全模式后,打开菜单Utilities-Terminal终端,输入csrutils disable
解锁系统文件保护。而后重启,回到正常系统中,sudo vim /System/Library/LaunchDaemon/com.apple.atrun.plist
将文件中22行-s
改成-sp
,保存退出。重启再次进入安全模式,命令行输入csrutils enable
锁定系统文件保护。再重启,回到正常系统,进行下一步。测试
brew uninstall --force gdb
打开系统的Applications -> Utilities -> Keychain Access
删除全部gdb相关的证书。
brew install gdb
打开系统keychain管理器:Keychain Access, go to menu Keychain Access-> Certificate Assistant -> Create a Certificate
。
建立新的证书,所填内容以下:
Name : gdb-cert Identity Type: Self Signed Root Certificate Type : Code Signing [X] Let me override defaults Serial Number : 1 Validity Period (days): 3650 Key Size : 2048 Algorithm : RSA [X] Include Key Usage Extension [X] This extension is critical Capabilities: [X] Signature [X] Include Extended Key Usage Extension [X] This extension is critical Capabilities: [X] Code Signing [X] Include Subject Alternate Name Extension Keychain: System
在Keychain管理器里,双击刚刚建立好的证书,在Trust
中所有选择为Always Trust
:
再打开命令行输入:
sudo killall taskgated codesign -fs "gdb-cert" `which gdb` launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
进入gdb调试程序,而后输入命令:
(gdb) set startup-with-shell off
而后正式开始调试。
若是调试没有问题,则将set startup-with-shell off
这句话写入~/.gdbinit
文件中,长久生效。
由于看到有人是因为更新了gdb或更新了os系统后才遇到问题,因此想是否是gdb版本与当前os版本不合的问题。
因此决定本身编译别的版本gdb。
官方各个版本的下载地址:https://ftp.gnu.org/gnu/gdb/
(通过测试,个人在MacOS 10.12 Sierra上编译各个新老版本gdb都编译不成功)
开始下载编译:
cd /tmp wget https://ftp.gnu.org/gnu/gdb/gdb-7.12.1.tar.gz cd gdb-*/ ./configure --prefix=/opt/gdb-7.12 && echo [ OK ] make && echo [ OK ] sudo make install && echo [ OK ]
我当前的系统是MacOS 10.12 Sierra。相关的说法是:
"None GDB 7.11 or 7.12.1 will not work on Sierra 10.12.4 In short it's because of Apple security upgrade. We need to wait for re-enabling when some new version will shows up."
顺着这条思路搜索,找到一个有人已经编译好的gdb
二进制单文件。而后再用codesign
给它签名,居然就能够用了!
在这里下载gdb_7.12.1_ sierra .zip
或在百度网盘下载。
解压后,备份并替换本机的gdb,放到/usr/local/bin/
中。而后pkill taskgated
并codesign -s gdb-cert /usr/local/bin/gdb
进行签名。
可是直接gdb
还不行,须要用sudo gdb ..
才能正经常使用。
注意:从新安装gdb后。第三方软件如cgdb
,须要从新安装才能使用,不然彻底没法用。
Mac上LLDB
才是王道。Xcode默认调试器是LLDB,说明了苹果不鸟GNU。也有人说,GDB是过去,LLDB是未来。虽然不必定正确,但也证实了LLDB也很强大。
再有一点最重要的理由:你的项目生产环境真的是在Mac上吗?
既然生产环境不在Mac,为何要用Mac编译?
这个逻辑一想通,就全通了—— 通常生产环境是在Linux服务器上的,因此你大能够共享项目文件夹给服务器,而后SSH进服务器进行编译调试。
若是只是学习语言用的小文件,那么更不必用到强大的GDB功能,在Mac本地用LLDB便可。
因此,惟一的缺点就是用不了各种GDB的衍生品、GUI一类,排除这点,仍是安心用LLDB吧,不要在Mac上折腾GDB了。。。