前言
本文介绍 mac 下成功安装 gdb 工具的安装步骤和避坑指南,先列出我的安装环境,因为环境真的很重要!
mac 下版本 10.15.6 Catalina
gdb-10.2
本文将分为三个部分行介绍,各位看官各取所需:
- gdb 下载安装
- 证书创建与授权
- golang 代码调试
1.gdb 下载安装
mac 上安装 gdb 工具有两种方式:
- brew 仓库安装
- 直接下载安装包,解压安装
1.1 brew 安装
执行步骤:
- 执行
brew search gdb
,搜索 brew 仓库(这一步当然可以不必执行,只是看一下 brew 仓库有没有,没有的话,更新一下 brew 指令:brew update
); - 执行
brew install gdb
使用 brew 仓库安装 gdb (默认最新); - 安装完可以查看 gdb 版本:
gdb -v
; - 还可以查看安装路径 :
which gdb
,默认路径是/usr/local/bin/gdb
;
1.2 下载安装包,进行安装
我使用的是 gdb-10.2 版本,安装包地址:gdb-10.2.tar.gz
安装步骤:
- 下载安装包 & 解压 & 进入解压后目录;
- 配置
./configure
; - 编译
make -j4
需要等待一定的时间; - 安装
make install
,顺利的话很快会安装完成,我目前没有遇到安装层面的问题; - 查看 gdb 版本:
gdb -v
; - 查看安装路径 :
which gdb
,默认路径是/usr/local/bin/gdb
;
至此安装完成!
1.3 调试程序
- 安装完成尝试一下调试程序:main,go
go
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
-
编译源码:
go build -gcflags=all="-N -l" -ldflags=-compressdwarf=false -o main main.go
-
执行 gdb main 进入程序调试,执行 info files 查看程序入口:
- 在程序入口设置断点进行调试 break *0x1068260
- 执行 run 运行程序,报错如下:
go
(gdb) run
Starting program: /Users/hanyafei/golang/myGoMod/main
Unable to find Mach task port for process-id 23330: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
这是因为 Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。换句话说 gdb 没有调试进程的权限,为了防止被恶意攻击,这个是 mac 系统默认打开的,所以需要 mac 系统对 gdb 产生信任,也就是为其创建证书进行签名。
2.证书创建与授权
2.1 证书创建
- 在你的应用(app)里先找到 mac 的证书程序,三个钥匙串的图标 & 打开:
- 创建证书:
- 证书名称一般叫:gdb_codesign,当然你随便起名字都行,后边要用,最好别包含中文!
- 后续过程一路继续就可以了,都不需要改动。
- 直到这里:选择"系统";这样证书就会出现在你的系统那一栏里,如果系统创建失败,选择登录也是可以的,不过创建完,需要把证书文件移入系统那一栏!
-
成功的标志,点击完成!
-
双击打开证书
-
修改为始终信任!
-
至此证书创建完成!恭喜!
2.2 证书授权
证书授权区分 mac 系统版本:
10.14 之前的系统,直接执行:codesign -fs gdb_codesign $(which gdb)
(因为我的系统是 10.15 这个方法对我不管用,需不需要重启,自己尝试一下)
10.14 之后的系统,比如我的系统 10.15.6 Catalina,授权步骤如下: 先创建一个文件 gdb-entitlement.xml
,内容为:
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.debugger</key>
<true/>
</dict>
</plist>
</pre>
然后在该文件的同级目录下执行:codesign --entitlements gdb-entitlement.xml -fs gdb_codesign $(which gdb)
,然后我就能用了,根本不用重启!!!
3.golang 代码调试
按照前面的步骤打上断点过后,执行 run 得到如下结果,表示调试成功!!!