Tips:如何优雅的使用GDB调试Go(gdb高级调试技巧)

网友投稿 432 2022-06-17


你可能有疑问,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

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

创建系统证书

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

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

复制代码

让gdb更理解go的调试信息

让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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Go Web:自带的ServeMux multiplexer(google play)
下一篇:Go语言学习小记(Go 语言)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~