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系列