1 配置环境设置:
(base) w:walrus w$ cat ~/.gdbinit
add-auto-load-safe-path /Users/w/go1.16/src/runtime/runtime-gdb.py
set startup-with-shell off
上面2行顺序不能反了,不然下面一行off不生效。 第一行作用是让gdb知道goalng的运行时符号信息能加载进来,第二行如果不加,gdb调试后r 或run命令会卡着在后台启动被调试程序。
2 macos gdb起来后run命令提示:
(gdb) r
Starting program: /Users/w/go/src/x.y.z/ecp/walrus/walrus
Unable to find Mach task port for process-id 1434: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
这里即便是brew install gdb安装的也不行,意思是缺乏安全证书签名。需要配置一个自签名证书给gdb二进制签名。
3 签名证书制作:
在启动台输入搜索关键字"key" 选择钥匙串访问, 然后
名称自己设置一个即可 勾选覆盖默认值选项,类型选择代码签名。
这里不要选择系统,就选择钥匙串: 登录 这种类型,后面创建完毕在把它从登录拖拽到系统下面。
其他都是一路『继续』,创建完毕
在左侧上方的钥匙串栏目选择登录,可以看到右边有自己设置的key, 选中,右键选择显示简介,设置信任为始终信任:
弹出需要输入密码,输入自己的登录密码。
到这里,创建完毕,在把证书整个从登录下面拖拽到系统下面。这样就可以看到证书移到系统下面了,千万不要按照网上说的一上来就选择系统这种类型,否则最后会创建失败。
下面准备签名gdb二进制
首先准备一个签名xml:
然后对gdb进行签名:
codesign --entitlements gdb-sigin.xml -fs gdb_sign /usr/local/bin/gdb 这里xml和gdb_sign都是自己上面创建的。
至此,gdb设置完毕。
如果要调试golang二进制,编译时需要加入选项:
-ldflags="-compressdwarf=false" 否则提示no debug symbols 找不到符号信息。
另外,golang通常会进行inline内联函数优化,所以还需要加入避免内联优化:
-gcflags="-N -l" 这里N表示禁止优化, l表示内联调用优化。
关于gcflags编译选项解释,可以参考:
gcflags还可以加入-m 表示:
-m print optimization decisions 实际主要是展示是否分配变量到堆上的抉择等,类似:
(base) w:walrus w$ go build -gcflags="-m -l" -ldflags="-compressdwarf=false"
# x.y.z/ecp/walrus
./main.go:80:23: main ignoring self-assignment in msgs[i], msgs[swc] = <N>
./main.go:80:23: main ignoring self-assignment in msgs[i], msgs[swc] = <N>
./main.go:106:10: signals does not escape
./main.go:37:13: ... argument does not escape
./main.go:37:13: a escapes to heap
./main.go:37:13: b escapes to heap
./main.go:41:43: bson.M{} escapes to heap
./main.go:45:13: ... argument does not escape
./main.go:45:14: "removeall: " escapes to heap
./main.go:48:15: make([]libs.RawMessage, 32) escapes to heap
同样go tool link --help可以查看常用的比如-w -s链接优化含义。