1. 摘要
本文講解gdb調(diào)試GOLANG程序的入門配置,以及gdb命令詳解備忘。
2. gdb調(diào)試go程序入門
gdb是linux系統(tǒng)自帶的調(diào)試器,功能十分強大,它不僅支持C/C++調(diào)試,也支持GO程序調(diào)試。
GDB是FSF(自由軟件基金會)發(fā)布的一個強大的類UNIX系統(tǒng)下的程序調(diào)試工具。使用GDB可以做如下事情:
(1)啟動程序,可以按照開發(fā)者的自定義要求運行程序。
(2)可讓被調(diào)試的程序在開發(fā)者設(shè)定的調(diào)置的斷點處停住。(斷點可以是條件表達式)
(3)當程序被停住時,可以檢查此時程序中所發(fā)生的事。
(4)動態(tài)的改變當前程序的執(zhí)行環(huán)境。
目前支持調(diào)試Go程序的GDB版本必須大于7.1。
編譯Go程序的時候需要注意以下幾點:
(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)進行了幾次。
package main
import (
"fmt"
)
func main() {
for i := 0; i < 5; i++ {
fmt.Println("looping %d times", i)
}
fmt.Println("Done")
}
正常情況下編譯運行的結(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 打斷點
在第9行打斷點:
(gdb) b main.go:9
Breakpoint 1 at 0x486a97: file /root/go/src/test/main.go, line 9.
2.3.2 運行到斷點
(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 查看當前的局部變量,繼續(xù)運行到下一個斷點
(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 查看當前所有斷點,取消斷點
(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è)置斷點;
(gdb) d 2 //delete,后面跟上斷點設(shè)置的序號,這個序號可以通過info breakpoints獲取相應(yīng)的設(shè)置的斷點序號
(gdb) info breakpoints // 查看所有斷點。
(gdb) r //run, 啟動進程,觸發(fā)第一個斷點。
(gdb) next //簡寫命令 n,用來單步調(diào)試,跳到下一步,當有斷點之后,可以輸入n跳轉(zhuǎn)到下一步繼續(xù)執(zhí)行
(gdb) c //continue,繼續(xù)執(zhí)行,觸發(fā)下一個斷點。
(gdb) set variable //該命令用來改變運行過程中的變量值,格式如:set variable <var>=<value>;
(gdb) info goroutines // 查看 goroutines 信息。
(gdb) goroutine 1 bt // 查看指定序號的 goroutine 調(diào)用堆棧
(gdb) bt // backtrace,查看當前調(diào)?堆棧,可以與當前 goroutine 調(diào)用堆棧對比。
(gdb) info frame // 堆棧幀信息。
(gdb) info locals // 查看局部變量。
(gdb) info goroutines //顯示當前執(zhí)行的goroutine列表,如下代碼所示,帶*的表示當前執(zhí)行的
(gdb) p s // 以 Pretty-Print 方式查看變量。
(gdb) clear //清除所有設(shè)置在函數(shù)上的斷點。
(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