1. 摘要
本文講解gdb調(diào)試GOLANG程序的入門配置仆邓,以及gdb命令詳解備忘铭污。
2. gdb調(diào)試go程序入門
gdb是linux系統(tǒng)自帶的調(diào)試器,功能十分強(qiáng)大而克,它不僅支持C/C++調(diào)試猛拴,也支持GO程序調(diào)試仁热。
GDB是FSF(自由軟件基金會)發(fā)布的一個強(qiáng)大的類UNIX系統(tǒng)下的程序調(diào)試工具揍很。使用GDB可以做如下事情:
(1)啟動程序融柬,可以按照開發(fā)者的自定義要求運(yùn)行程序颊咬。
(2)可讓被調(diào)試的程序在開發(fā)者設(shè)定的調(diào)置的斷點(diǎn)處停住务甥。(斷點(diǎn)可以是條件表達(dá)式)
(3)當(dāng)程序被停住時,可以檢查此時程序中所發(fā)生的事喳篇。
(4)動態(tài)的改變當(dāng)前程序的執(zhí)行環(huán)境敞临。
目前支持調(diào)試Go程序的GDB版本必須大于7.1。
編譯Go程序的時候需要注意以下幾點(diǎn):
(1)傳遞參數(shù)-ldflags "-s"麸澜,忽略debug的打印信息
(2)傳遞-gcflags "-N -l" 參數(shù)挺尿,這樣可以忽略Go內(nèi)部做的一些優(yōu)化,聚合變量和函數(shù)等優(yōu)化痰憎,這樣對于GDB調(diào)試來說非常困難票髓,所以在編譯的時候加入這兩個參數(shù)避免這些優(yōu)化。
2.1 配置gdb
(1) 打開gdb初始化配置文件
vim ~/.gdbinit
(2) 增加一行铣耘,:wq!保存后退出
add-auto-load-safe-path /usr/local/go/src/runtime/runtime-gdb.py
2.2 編譯golang
假設(shè)源碼文件為main.go洽沟,查看循環(huán)進(jìn)行了幾次。
package main
import (
"fmt"
)
func main() {
for i := 0; i < 5; i++ {
fmt.Println("looping %d times", i)
}
fmt.Println("Done")
}
正常情況下編譯運(yùn)行的結(jié)果如下:
root@iZ2zeaij0rxu0p2muizoirZ:~/go/src/test# go run main.go
looping %d times 0
looping %d times 1
looping %d times 2
looping %d times 3
looping %d times 4
Done
雖然gdb也支持golang了蜗细,但是在編譯golang仍然需要加一些特殊的參數(shù)裆操,否則出現(xiàn)如下的錯誤:
No symbol in current context
就是程序內(nèi)的變量怒详,你都無法打印,gdb說找不到踪区。所以編譯時昆烁,需要加下列的參數(shù):
go build -gcflags "-N -l" main.go
2.3 gdb調(diào)試
使用gdb啟動一個go程序:
root@iZ2zeaij0rxu0p2muizoirZ:~/go/src/test# gdb main
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...done.
Loading Go Runtime support.
(gdb)
其中,出現(xiàn)“Loading Go Runtime support "這句話缎岗,就表示gdb可以支持golang静尼。”
2.3.1 打斷點(diǎn)
在第9行打斷點(diǎn):
(gdb) b main.go:9
Breakpoint 1 at 0x486a97: file /root/go/src/test/main.go, line 9.
2.3.2 運(yùn)行到斷點(diǎn)
(gdb) run
Starting program: /root/go/src/test/main
[New LWP 7260]
[New LWP 7261]
[New LWP 7262]
[New LWP 7263]
Thread 1 "main" hit Breakpoint 1, main.main () at /root/go/src/test/main.go:9
9 fmt.Println("looping %d times", i)
2.3.3 查看當(dāng)前的局部變量传泊,繼續(xù)運(yùn)行到下一個斷點(diǎn)
(gdb) p i
$1 = 0
(gdb) info locals
i = 0
(gdb) c
Continuing.
looping %d times 0
Thread 1 "main" hit Breakpoint 1, main.main () at /root/go/src/test/main.go:9
9 fmt.Println("looping %d times", i)
(gdb) p i
$3 = 1
2.3.4 查看當(dāng)前所有斷點(diǎn)鼠渺,取消斷點(diǎn)
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000486a97 in main.main at /root/go/src/test/main.go:9
breakpoint already hit 2 times
(gdb) disable breakpoint 1
2.3.5 退出
(gdb) quit
root@iZ2zeaij0rxu0p2muizoirZ:~/go/src/test#
3,GDB調(diào)試命令列表
(gdb) list 15 //顯示十行代碼眷细,其中第15行在顯示的十行里面的中間拦盹,如下所示
(gdb) b 10 //break,在第十行設(shè)置斷點(diǎn);
(gdb) d 2 //delete,后面跟上斷點(diǎn)設(shè)置的序號溪椎,這個序號可以通過info breakpoints獲取相應(yīng)的設(shè)置的斷點(diǎn)序號
(gdb) info breakpoints // 查看所有斷點(diǎn)普舆。
(gdb) r //run, 啟動進(jìn)程,觸發(fā)第一個斷點(diǎn)校读。
(gdb) next //簡寫命令 n,用來單步調(diào)試沼侣,跳到下一步,當(dāng)有斷點(diǎn)之后地熄,可以輸入n跳轉(zhuǎn)到下一步繼續(xù)執(zhí)行
(gdb) c //continue华临,繼續(xù)執(zhí)行芯杀,觸發(fā)下一個斷點(diǎn)端考。
(gdb) set variable //該命令用來改變運(yùn)行過程中的變量值,格式如:set variable <var>=<value>;
(gdb) info goroutines // 查看 goroutines 信息揭厚。
(gdb) goroutine 1 bt // 查看指定序號的 goroutine 調(diào)用堆棧
(gdb) bt // backtrace却特,查看當(dāng)前調(diào)?堆棧,可以與當(dāng)前 goroutine 調(diào)用堆棧對比筛圆。
(gdb) info frame // 堆棧幀信息裂明。
(gdb) info locals // 查看局部變量。
(gdb) info goroutines //顯示當(dāng)前執(zhí)行的goroutine列表太援,如下代碼所示,帶*的表示當(dāng)前執(zhí)行的
(gdb) p s // 以 Pretty-Print 方式查看變量闽晦。
(gdb) clear //清除所有設(shè)置在函數(shù)上的斷點(diǎn)。
(gdb) help all //可以看到所有的命令
4. 參考
(1)提岔,調(diào)試Go程序
https://blog.csdn.net/wanchope/article/details/53367064
(2)仙蛉,gdb調(diào)試golang程序
https://blog.csdn.net/KentZhang_/article/details/84922427
(3),使用 gdb 工具調(diào)試 Go
https://www.oschina.net/translate/using-gdb-debugger-with-go
(4)碱蒙,GDB調(diào)試命令詳解
https://blog.csdn.net/linux7985/article/details/52399439
(5) Golang系列(十)之GDB調(diào)試
https://blog.csdn.net/huwh_/article/details/77140752
5 面試題目
(1)golang 語言面試題總結(jié)
https://www.jishuchi.com/read/go-interview/3435
(2)Golang精編100題-搞定golang面試
https://blog.csdn.net/itcastcpp/article/details/80462619