Tips:如何優雅的使用GDB調試Go

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篇:3步便可調試

docker加持的話,很是方便,隨用隨起

先上效果:戳 gdb-debug-go-in-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這些參數是幹啥的,下邊附資料,感興趣自行查看

具體討論見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

  • libsystem_darwin.dylib錯誤

直接忽略就行,詳見:GDB giving weird errors

詳細代碼見NewbMiao/free-hands-tips

See more:


文章首發公衆號: newbmiao (歡迎關注,獲取及時更新內容)

推薦閱讀:Dig101-Go系列

newbmiao
相關文章
相關標籤/搜索