go語言程式-gdb除錯問題
以前經常用gdb除錯C/C++程式,當學習golang的時候,發現golang的程式也是支援gdb除錯的,然而還是遇到一些問題。比如說除錯etcd程式就遇到如下問題:
【問題1】 info goroutines,提示找不到Undefined info command: "goroutines". Try "help info".
解決方法:啟動gdb後,執行目標程式之前(輸入r之前),手動載入runtime/runtime-gdb.py,執行如下命令:source /usr/lib/golang/src/runtime/runtime-gdb.py
原因:對於golang相關的特性,gdb本身並不熟知,因此需要通過外掛方式使gdb感知到。
驗證:
(gdb) b 28
Breakpoint 1 at 0xcc032b: file /root/etcd/src/github.com/coreos/etcd/gopath/src/github.com/coreos/etcd/cmd/etcd/main.go, line 28.(gdb) r
Starting program: /root/etcd/src/github.com/coreos/etcd/bin/etcd
(gdb) info goroutines
* 1 running runtime.systemstack_switch
2 waiting runtime.gopark
17 waiting runtime.gopark
33 waiting runtime.gopark
* 49 running runtime.gopark
42 runnable runtime.gopark
* 40 syscall runtime.notetsleepg
43 runnable runtime.gopark
* 74 syscall runtime.notetsleepg
(gdb) n
39 startEtcdOrProxyV2()
(gdb) s
github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/etcdmain.startEtcdOrProxyV2 ()
at /root/etcd/src/github.com/coreos/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/etcdmain/etcd.go:57
57 func startEtcdOrProxyV2() {
(gdb) n
58 grpc.EnableTracing = false
(gdb) p grpc
No symbol "grpc" in current context.
【問題2】列印全域性變數是提示No symbol "XXX" in current context.
原因:對於golang語言的程式,並不能像C/C++直接列印全域性變數,需要通過路徑+變數名字才可以打印出來
解決方法:
1)先檢視全域性變數所在位置,通過info variables XXX
(gdb) info variables grpc.EnableTracing
All variables matching regular expression "grpc.EnableTracing":
File go:
bool github.com/coreos/etcd/cmd/vendor/google.golang.org/grpc.EnableTracing;
2)列印全域性變數
(gdb) p 'github.com/coreos/etcd/cmd/vendor/google.golang.org/grpc.EnableTracing'
$1 = true注意列印一定要有雙引號/單引號
【問題3】列印變數長度,不能p len(XXX)必須是p $len(XXX)