Tips: all for hands-free.android
Tips 系列:记录平常解决问题、解放双手的一些小技巧。git
目的只有一个:不被重复的杂事麻痹,能偷懒的毫不手软。github
今天聊聊如何优雅的使用GDB调试Go程序。golang
GDB有啥用?docker
想了解代码底层的话,它是一大利器,更别说定位问题啥的。shell
具体骚操做见曹大的使用 debugger 学习 golang安全
但GDB从安装到可用,可能有一大堆问题要解决(尤为在Mac上),咱们怎么能优雅的使用它,避免陷入问题中,是本文的重点。bash
(涉及Docker和Mac两个平台上运行)网络
先来看比较推荐的Docker方式session
docker加持的话,很是方便,随用随起
先上效果:戳 gdb-debug-go-in-docker 可下载命令
具体步骤以下:(彻底回归工具本质,换台机器也能调试)
// 1. 已当前目录映射启动gdb
docker run --rm -it --security-opt="apparmor=unconfined" \
--security-opt="seccomp=unconfined" \
--cap-add=SYS_PTRACE -v "$(pwd):/go/src/app" \
newbmiao/gdb-go1.14rc1:latest bash
// 2. 编译go,不使用compressdwarf 、inline and escape
go build -ldflags=-compressdwarf=false -gcflags=all="-N -l" -o test test.go
// 3. 能够愉快的debug了
gdb ./test
复制代码
一套打完,收工,就这么简单。文末会附上怎么定义的docker。
你可能有疑问,docker这些参数是干啥的,下边附资料,感兴趣自行查看
AppArmor 是一个 Linux 内核安全模块,可用于限制主机操做系统上运行的进程的功能。每一个进程均可以拥有本身的安全配置文件。安全配置文件用来容许或禁止特定功能,例如网络访问或文件读/写/执行权限。
详见AppArmor security profiles for Docker
Seccomp是Secure computing mode的缩写,它是Linux内核提供的一个操做,用于限制一个进程能够执行的系统调用.固然,咱们须要有一个配置文件来指明进程到底能够执行哪些系统调用,不能够执行哪些系统调用.在Docker中,它使用Seccomp来限制一个容器能够执行的系统调用。
详见Seccomp security profiles for Docker
配合seccomp=unconfined
, 容许容器使用ptrace运行strace / ltrace之类的程序。
版本: gdb 8.3.1
On macoOS High Serria 10.13.6
步骤:
gdb-cert
重点是标红处,其余一路下一步便可。(注意证书建立成功,才能签名成功)
(若是建立失败,能够删除证书,重启建立(推荐);或者尝试建立登陆证书=》导出=》=》加载到系统证书)
已建立脚本,直接执行:
sh debugger/gdb/installMac.sh
证书相关具体参见:PermissionsDarwin
一样列一下可能遇到的问题:
Unable to find Mach task port for process-id 3884: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
复制代码
$ gdb ./test
>>> r
Starting program: /Users/newbmiao/Documents/tech/Dig101-Go/test
[New Thread 0xd03 of process 7603]
# 卡住。。。
复制代码
解决方法:
直接别的窗口找到对应进程id,kill掉,后续会正常
ps aux|grep gdb
kill -9 xxx
复制代码
详见:GDB kind of doesn't work on macOS Sierra
解决方法:
# gdb 的配置
$ cat ~/.gdbinit
# gdb-dashboard
// $ cat ~/.gdbinit.d/init
set startup-with-shell off
复制代码
让gdb打印更易读,不压缩dwarf
go build -ldflags=-compressdwarf=false -gcflags=all="-N -l" -o test test.go
gdb使用
$GOROOT/src/runtime/runtime-gdb.py
来加载go运行时支持. 能够从二进制文件中查看到:strings test |grep gdb
直接忽略就行,详见:GDB giving weird errors
See more:
文章首发公众号: newbmiao (欢迎关注,获取及时更新内容)
推荐阅读:Dig101-Go系列