gdb調試golang程序


gdb是linux系統自帶的調試器,功能十分強大,對於C/C++程序員不會陌生,那麼使用gdb如何調試golang程序呢?

1、配置gdb

golang這門語言是2009年纔出來,gdb並沒有原生支持調試golang,這裏需要配置gdb,使它支持golang,關於這裏面的原理,我還不是很清楚,應該是gdb本身支持擴展,可以以提供插件的形式擴展支持其他語言,具體怎麼樣,我也不是很清楚,待後續研究。

言歸正傳,這樣配置:

1、打開gdb初始化配置文件

vim /home/KentZhang/.gdbinit  ## 注意,KentZhang是我的家目錄,你需要改成你的家目錄

2、增加如下的一行

add-auto-load-safe-path /usr/local/go/src/runtime/runtime-gdb.py ## 注意, /usr/local/go是我的golang安裝目錄 

3、然後重啓gdb

使用gdb啓動一個go程序:

[KentZhang@LOCAL-192-168-97-2 bak]$ gdb demo.exe
GNU gdb (GDB) 7.6.2
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/KentZhang/bak/demo.exe...done.
Loading Go Runtime support.
(gdb) 

Loading Go Runtime support 出現這句話,就表示gdb可以支持golang。

2、編譯golang

雖然gdb也支持golang了,但是在編譯golang仍然需要加一些特殊的參數,否則出現如下的錯誤:

No symbol  in current context

就是程序內的變量,你都無法打印,gdb說找不到。所以編譯時,需要加下列的參數:

go build -gcflags=all="-N -l"  ## 必須這樣編譯,才能用gdb打印出變量,第二個是小寫的L,不是大寫的i

3、打斷點

關於打斷點,必須使用特定的方式,由於golang是以包爲單位管理代碼,所有打斷點時,要注意包名。

1、包名+函數名

(gdb) b main.main ## main包的main函數
Breakpoint 1 at 0x2131: file main.go, line 14.

(gdb) b framework/rpcclient/reqprocess.suitableMethods  ## 注意包的全路徑,這種方式要注意

gdb) b hundreds.(*Game).OnUserLogin    ## *Game,表示指針的方式實現的,用Game反而打不到斷點
Note: breakpoint 1 also set at pc 0x67ce70.
Breakpoint 2 at 0x67ce70: file /home/KentZhang/Hundreds/src/hundreds/game.go, line 57.

2、文件名+行號

(gdb) b main.go:17 
Breakpoint 2 at 0x2167: file main.go, line 17.

4、總結

基本上經過三個步驟,就可以像調試C/C++一樣調試golang了。
由於gdb不支持協程的調試,所以gdb調試golang有時候顯得捉襟見肘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章