34

Tips-如何优雅的使用GDB调试Go

 4 years ago
source link: http://blog.newbmiao.com/2020/02/18/tips-use-gdb-elegantly.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Tips: all for hands-free.

Tips 系列:记录日常解决问题、解放双手的一些小技巧。

目的只有一个:不被重复的琐事麻痹,能偷懒的绝不手软。

今天聊聊如何优雅的使用GDB调试Go程序。

GDB有啥用?

想了解代码底层的话,它是一大利器,更别说定位问题啥的。

具体骚操作见曹大的 使用 debugger 学习 golang

但GDB从安装到可用,可能有一大堆问题要解决(尤其在Mac上),我们怎么能优雅的使用它,避免陷入问题中,是本文的重点。

(涉及Docker和Mac两个平台上运行)

先来看比较推荐的Docker方式

Docker篇:3步即可调试

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这些参数是干啥的,下边附资料,感兴趣自行查看

具体讨论见issue: apparmor denies ptrace to docker-default profile

  • AppArmor

AppArmor 是一个 Linux 内核安全模块,可用于限制主机操作系统上运行的进程的功能。每个进程都可以拥有自己的安全配置文件。安全配置文件用来允许或禁止特定功能,例如网络访问或文件读/写/执行权限。

详见 AppArmor security profiles for Docker

  • Seccomp

Seccomp是Secure computing mode的缩写,它是Linux内核提供的一个操作,用于限制一个进程可以执行的系统调用.当然,我们需要有一个配置文件来指明进程到底可以执行哪些系统调用,不可以执行哪些系统调用.在Docker中,它使用Seccomp来限制一个容器可以执行的系统调用。

详见 Seccomp security profiles for Docker

  • SYS_PTRACE

配合 seccomp=unconfined , 允许容器使用ptrace运行strace / ltrace之类的程序。

Mac篇:需要证书签名

版本: gdb 8.3.1 On macoOS High Serria 10.13.6

步骤:

  • 创建系统证书 gdb-cert

重点是标红处,其他一路下一步即可。(注意证书创建成功,才能签名成功)

zMfYR3y.gif

(如果创建失败,可以 删除证书,重启创建 (推荐);或者尝试创建登录证书=》导出=》=》加载到系统证书)

  • gdb代码签名

已创建脚本,直接执行:

sh debugger/gdb/installMac.sh

  • gdb调试(方式同docker篇)

证书相关具体参见: PermissionsDarwin

同样列一下可能遇到的问题:

  • codesign
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
  • SIG113问题

详见: GDB kind of doesn’t work on macOS Sierra

解决方法:

# gdb 的配置
$ cat ~/.gdbinit
# gdb-dashboard
// $ cat ~/.gdbinit.d/init
set startup-with-shell off

详细代码见 NewbMiao/free-hands-tips


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK