日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
學(xué)會(huì)使用GDB調(diào)試Go代碼

本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚(yú)了」,作者陳煎魚(yú)。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚(yú)了公眾號(hào)。

創(chuàng)新互聯(lián)專注于平山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供平山營(yíng)銷型網(wǎng)站建設(shè),平山網(wǎng)站制作、平山網(wǎng)頁(yè)設(shè)計(jì)、平山網(wǎng)站官網(wǎng)定制、小程序開(kāi)發(fā)服務(wù),打造平山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供平山網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

大家好,我是煎魚(yú)。

上一篇文章《一個(gè) Demo 學(xué)會(huì)使用 Go Delve 調(diào)試》我們?cè)敿?xì)介紹了 Go 語(yǔ)言如何使用 Delve 進(jìn)行排查和調(diào)試,對(duì)于問(wèn)題的解決非常的有幫助。

但調(diào)試工具肯定不止只有 Delve,今天我們來(lái)介紹第二個(gè)神器,那就是:GDB,補(bǔ)全我們的調(diào)試工具技術(shù)棧。

根據(jù)小伙伴們的反饋,我們后面再增加 IDE 的調(diào)試篇章。

GDB 是什么

GDB 是一個(gè)類 UNIX 系統(tǒng)下的程序調(diào)試工具,允許你看到另一個(gè)程序在執(zhí)行時(shí) "內(nèi)部 "發(fā)生了什么,或者程序在崩潰時(shí)正在做什么。

主要可以做四類事情:

  • 啟動(dòng)你的程序,指定任何可能影響其行為的東西。
  • 使你的程序在指定的條件下停止。
  • 檢查當(dāng)你的程序停止時(shí)發(fā)生了什么。
  • 改變你程序中的東西,這樣你就可以試驗(yàn)糾正一個(gè)錯(cuò)誤的影響,并繼續(xù)了解另一個(gè)錯(cuò)誤。

安裝

如果是在 MacOS 上的話,可以直接使用 brew 安裝:

 
 
 
 
  1. brew install gdb 

如果是在 Linux ,則使用自帶的包管理工具進(jìn)行安裝即可,但需要注意安裝完畢后需要在 HOME 目錄進(jìn)行相關(guān)配置。

安裝完畢后,執(zhí)行 gdb 就可以看到:

 
 
 
 
  1. $ gdb 
  2. GNU gdb (GDB) 10.2 
  3. ... 
  4. (gdb)  

寫此文時(shí)最新的 gdb 版本已經(jīng)是 10.2 了,我也升級(jí)了上去。問(wèn)題不大,還多了不少功能。

編譯

我們還是使用先前的演示程序來(lái)進(jìn)行調(diào)試。但由于 Go 語(yǔ)言的不少編譯優(yōu)化,因此在編譯運(yùn)行程序時(shí),有以下幾點(diǎn)需要注意:

  • go build 編譯時(shí)需要增加 -gcflags=all="-N -l" 指令來(lái)關(guān)閉內(nèi)聯(lián)優(yōu)化,方便接下來(lái)的調(diào)試。
  • 若是 MacOS,在 go build 編譯時(shí)需要增加 -ldflags='-compressdwarf=false' 指令。
    • 若不禁止,則會(huì)出現(xiàn) No symbol table is loaded. Use the "file" command. 的錯(cuò)誤。
    • Go 編譯默認(rèn)為了減少二進(jìn)制大小會(huì)默認(rèn)壓縮 DWARF 調(diào)試信息,但這會(huì)影響 gdb 的調(diào)試,因此需要將其關(guān)閉。

編譯的命令是:

 
 
 
 
  1. $ go build -gcflags=all="-N -l" -ldflags='-compressdwarf=false' . 

輸出結(jié)果:

 
 
 
 
  1. !了魚(yú)煎進(jìn)子腦 

嘗試 gdb

GDB 有兩種調(diào)試模式,分別是文本用戶界面(Text User Interface,簡(jiǎn)稱 tui)和默認(rèn)的命令行模式:

 
 
 
 
  1. // 調(diào)試界面 
  2. $ gdb -tui ./awesome-project 
  3.  
  4. // 命令行模式 
  5. $ gdb ./awesome-project 

接下來(lái)我們使用 gdb tui 的調(diào)試模式來(lái)給大家演示功能。

我們?cè)趫?zhí)行命令 gdb -tui ./awesome-project 后,窗口會(huì)切換為如下:

gdb tui 初始樣子

你會(huì)發(fā)現(xiàn)中間提示 “No Source Available”,此時(shí)你需要繼續(xù)回車兩次,他就會(huì)自動(dòng)加載插件支持,提示:“Loading Go Runtime support.”。

我們就可以看到具體的代碼塊內(nèi)容,如下:

用 MacOS 的同學(xué)需要注意,如果你在斷點(diǎn)時(shí)發(fā)現(xiàn)發(fā)現(xiàn)了如下錯(cuò)誤:

 
 
 
 
  1. (gdb) b main.main 
  2. Breakpoint 1 at 0x10a2ea0: file /Users/eddycjy/go-application/awesomeProject/main.go, line 15. 
  3. (gdb) r 
  4. Starting program: /Users/eddycjy/go-application/awesomeProject/hello 
  5. Unable to find Mach task port for process-id 64212: (os/kern) failure (0x5). 
  6.  (please check gdb is codesigned - see taskgated(8)) 

也就是 “please check gdb is codesigned - see taskgated(8)”,則需要重新處理證書(shū)認(rèn)證和授權(quán),是 MacOS 使用上的一個(gè)問(wèn)題,具體可參考:《Codesign gdb on OSX》。

解決后,咱們的 gdb 就算是能夠正確的運(yùn)行起來(lái)了!

常用 gdb 命令

在 gdb 中,和 dlv 一樣有常用的關(guān)鍵字命令。當(dāng)然了,gdb 的 help all 輸出非常多:

 
 
 
 
  1. (gdb) help all 
  2.  
  3. Command class: aliases 
  4. Command class: breakpoints 
  5.  
  6. awatch -- Set a watchpoint for an expression. 
  7. break, brea, bre, br, b -- Set breakpoint at specified location. 
  8. break-range -- Set a breakpoint for an address range. 
  9. catch -- Set catchpoints to catch events. 
  10. ... 

常用的關(guān)鍵字如下:

  • b:break 的縮寫,作用是打斷點(diǎn),例如:main.main,可帶代碼行數(shù)。
  • r:run 的縮寫,作用是運(yùn)行程序到下一個(gè)斷點(diǎn)處。
  • c:continue 的縮寫,作用是繼續(xù)執(zhí)行到下一個(gè)斷點(diǎn)。
  • s:step 的縮寫,作用是單步執(zhí)行,如果有所調(diào)用的方法,將會(huì)進(jìn)入該方法。
  • l:list 的縮寫,作用是查看對(duì)應(yīng)的源碼。
  • n:next 的縮寫,作用是單步執(zhí)行,不會(huì)進(jìn)入所調(diào)用的方法,。
  • q:quit 的縮寫,作用是退出。
  • info breakpoints:作用是查看所有設(shè)置的斷點(diǎn)信息。
  • info locals:作用是查看變量信息。
  • info args:作用是查看函數(shù)的入?yún)⒑统鰠⒌木唧w值。
  • info goroutines:作用是查看 goroutines 的信息。
  • goroutine 1 bt:作用是查看指定序號(hào)的 goroutine 調(diào)用堆棧。

進(jìn)行調(diào)試

在調(diào)試上與 dlv 差不多,也是先執(zhí)行關(guān)鍵字 b 打斷點(diǎn):

 
 
 
 
  1. (gdb) b main.main 
  2. Breakpoint 1 at 0x10cbaa0: file /Users/eddycjy/go-application/awesomeProject/main.go, line 9. 

也可以先執(zhí)行關(guān)鍵字 l 查看對(duì)應(yīng)的代碼情況再進(jìn)行做決定:

 
 
 
 
  1. (gdb) l main.main 
  2. 4  "fmt" 
  3. 5  
  4. 6  "github.com/eddycjy/awesome-project/stringer" 
  5. 7 ) 
  6. 8  
  7. 9 func main() { 
  8. 10  fmt.Println(stringer.Reverse("腦子進(jìn)煎魚(yú)了!")) 
  9. 11 } 

查看對(duì)應(yīng) goroutines 正在運(yùn)行的函數(shù)情況:

 
 
 
 
  1. (gdb) info goroutines 
  2.   1  waiting runtime.gosched 
  3. * 13  running runtime.goexit 

根據(jù) pprof 等所得到的 goroutine 序號(hào)進(jìn)行進(jìn)一步的分析:

 
 
 
 
  1. (gdb) goroutine 1 bt 
  2. #0  0x000000000040facb in runtime.gosched () at /home/user/go/src/runtime/proc.c:873 
  3. #1  0x00000000004031c9 in runtime.chanrecv (c=void, ep=void, selected=void, received=void) 
  4.  at  /home/user/go/src/runtime/chan.c:342 
  5. #2  0x0000000000403299 in runtime.chanrecv1 (t=void, c=void) at/home/user/go/src/runtime/chan.c:423 
  6. #3  0x000000000043075b in testing.RunTests (matchString... 

注意一個(gè)細(xì)節(jié),gdb 調(diào)試是可以看到并對(duì) runtime 包內(nèi)容的代碼進(jìn)行斷點(diǎn)和分析的。

也可以和 dlv 一樣執(zhí)行 p 關(guān)鍵字輸出相應(yīng)的值的類型、值內(nèi)容:

 
 
 
 
  1. (gdb) p re 
  2. (gdb) p t 
  3. $1 = (struct testing.T *) 0xf840688b60 
  4. (gdb) p t 
  5. $1 = (struct testing.T *) 0xf840688b60 
  6. (gdb) p *t 
  7. $2 = {errors = "", failed = false, ch = 0xf8406f5690} 
  8. (gdb) p *t->ch 
  9. $3 = struct hchan<*testing.T> 

與 dlv 大同小異。

總結(jié)

總體上來(lái)講,MacOS 上使用 gdb 還是挺麻煩的,在 Linux 環(huán)境下使用 gdb 還是更方便些。

由于 dlv 和 gdb 在大致的調(diào)試上不會(huì)差距的太遠(yuǎn),因此本文就沒(méi)有過(guò)于展開(kāi)。

若是對(duì)業(yè)務(wù)代碼進(jìn)行分析,更建議使用 dlv,也就是我們上一篇文章所講的內(nèi)容。若有 runtime 庫(kù)的調(diào)試需求的話,推薦使用 gdb 來(lái)作為首要調(diào)試工具,若無(wú)這方面訴求,建議使用 dlv。


網(wǎng)站題目:學(xué)會(huì)使用GDB調(diào)試Go代碼
網(wǎng)頁(yè)地址:http://m.5511xx.com/article/cdoeddp.html