【實(shí)踐】golang程序入門及gdb命令列表【含面試題】

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荠瘪,一起剝皮案震驚了整個濱河市夯巷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哀墓,老刑警劉巖趁餐,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異篮绰,居然都是意外死亡后雷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門吠各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喷面,“玉大人,你說我怎么就攤上這事走孽【灞玻” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵磕瓷,是天一觀的道長盒齿。 經(jīng)常有香客問我,道長困食,這世上最難降的妖魔是什么边翁? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮硕盹,結(jié)果婚禮上符匾,老公的妹妹穿的比我還像新娘。我一直安慰自己瘩例,他們只是感情好啊胶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垛贤,像睡著了一般焰坪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聘惦,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天某饰,我揣著相機(jī)與錄音,去河邊找鬼善绎。 笑死黔漂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禀酱。 我是一名探鬼主播炬守,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼比勉!你這毒婦竟也來了劳较?” 一聲冷哼從身側(cè)響起驹止,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎观蜗,沒想到半個月后臊恋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墓捻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年抖仅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砖第。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撤卢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梧兼,到底是詐尸還是另有隱情放吩,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布羽杰,位于F島的核電站渡紫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏考赛。R本人自食惡果不足惜惕澎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颜骤。 院中可真熱鬧唧喉,春花似錦、人聲如沸忍抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梯找。三九已至唆阿,卻和暖如春益涧,著一層夾襖步出監(jiān)牢的瞬間锈锤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工闲询, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留久免,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓扭弧,卻偏偏與公主長得像阎姥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸽捻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容