国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

學會使用 GDB 調試 Go 代碼

開發 后端
GDB 是一個類 UNIX 系統下的程序調試工具,允許你看到另一個程序在執行時 "內部 "發生了什么,或者程序在崩潰時正在做什么。

[[413707]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉載本文請聯系腦子進煎魚了公眾號。

大家好,我是煎魚。

上一篇文章《一個 Demo 學會使用 Go Delve 調試》我們詳細介紹了 Go 語言如何使用 Delve 進行排查和調試,對于問題的解決非常的有幫助。

但調試工具肯定不止只有 Delve,今天我們來介紹第二個神器,那就是:GDB,補全我們的調試工具技術棧。

根據小伙伴們的反饋,我們后面再增加 IDE 的調試篇章。

GDB 是什么

GDB 是一個類 UNIX 系統下的程序調試工具,允許你看到另一個程序在執行時 "內部 "發生了什么,或者程序在崩潰時正在做什么。

主要可以做四類事情:

  • 啟動你的程序,指定任何可能影響其行為的東西。
  • 使你的程序在指定的條件下停止。
  • 檢查當你的程序停止時發生了什么。
  • 改變你程序中的東西,這樣你就可以試驗糾正一個錯誤的影響,并繼續了解另一個錯誤。

安裝

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

  1. brew install gdb 

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

安裝完畢后,執行 gdb 就可以看到:

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

寫此文時最新的 gdb 版本已經是 10.2 了,我也升級了上去。問題不大,還多了不少功能。

編譯

我們還是使用先前的演示程序來進行調試。但由于 Go 語言的不少編譯優化,因此在編譯運行程序時,有以下幾點需要注意:

  • go build 編譯時需要增加 -gcflags=all="-N -l" 指令來關閉內聯優化,方便接下來的調試。
  • 若是 MacOS,在 go build 編譯時需要增加 -ldflags='-compressdwarf=false' 指令。
    • 若不禁止,則會出現 No symbol table is loaded. Use the "file" command. 的錯誤。
    • Go 編譯默認為了減少二進制大小會默認壓縮 DWARF 調試信息,但這會影響 gdb 的調試,因此需要將其關閉。

編譯的命令是:

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

輸出結果:

  1. !了魚煎進子腦 

嘗試 gdb

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

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

接下來我們使用 gdb tui 的調試模式來給大家演示功能。

我們在執行命令 gdb -tui ./awesome-project 后,窗口會切換為如下:

gdb tui 初始樣子

你會發現中間提示 “No Source Available”,此時你需要繼續回車兩次,他就會自動加載插件支持,提示:“Loading Go Runtime support.”。

我們就可以看到具體的代碼塊內容,如下:

用 MacOS 的同學需要注意,如果你在斷點時發現發現了如下錯誤:

  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)”,則需要重新處理證書認證和授權,是 MacOS 使用上的一個問題,具體可參考:《Codesign gdb on OSX》。

解決后,咱們的 gdb 就算是能夠正確的運行起來了!

常用 gdb 命令

在 gdb 中,和 dlv 一樣有常用的關鍵字命令。當然了,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. ... 

常用的關鍵字如下:

  • b:break 的縮寫,作用是打斷點,例如:main.main,可帶代碼行數。
  • r:run 的縮寫,作用是運行程序到下一個斷點處。
  • c:continue 的縮寫,作用是繼續執行到下一個斷點。
  • s:step 的縮寫,作用是單步執行,如果有所調用的方法,將會進入該方法。
  • l:list 的縮寫,作用是查看對應的源碼。
  • n:next 的縮寫,作用是單步執行,不會進入所調用的方法,。
  • q:quit 的縮寫,作用是退出。
  • info breakpoints:作用是查看所有設置的斷點信息。
  • info locals:作用是查看變量信息。
  • info args:作用是查看函數的入參和出參的具體值。
  • info goroutines:作用是查看 goroutines 的信息。
  • goroutine 1 bt:作用是查看指定序號的 goroutine 調用堆棧。

進行調試

在調試上與 dlv 差不多,也是先執行關鍵字 b 打斷點:

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

也可以先執行關鍵字 l 查看對應的代碼情況再進行做決定:

  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("腦子進煎魚了!")) 
  9. 11 } 

查看對應 goroutines 正在運行的函數情況:

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

根據 pprof 等所得到的 goroutine 序號進行進一步的分析:

  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... 

注意一個細節,gdb 調試是可以看到并對 runtime 包內容的代碼進行斷點和分析的。

也可以和 dlv 一樣執行 p 關鍵字輸出相應的值的類型、值內容:

  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 大同小異。

總結

總體上來講,MacOS 上使用 gdb 還是挺麻煩的,在 Linux 環境下使用 gdb 還是更方便些。

由于 dlv 和 gdb 在大致的調試上不會差距的太遠,因此本文就沒有過于展開。

若是對業務代碼進行分析,更建議使用 dlv,也就是我們上一篇文章所講的內容。若有 runtime 庫的調試需求的話,推薦使用 gdb 來作為首要調試工具,若無這方面訴求,建議使用 dlv。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2021-07-26 10:14:38

Go語言工具

2015-08-14 09:21:09

gdb工具調試 Go

2021-03-15 06:23:40

GDB調試代碼編程語言

2023-11-10 09:20:28

Java工具

2013-12-19 09:20:59

2021-12-28 07:20:43

Hippo WebAssembly云原生

2023-12-27 07:40:43

HTTP服務器負載均衡

2025-03-31 03:25:00

2023-06-28 08:12:49

Python代碼重構

2009-11-05 15:25:36

WCF服務端配置

2015-11-06 13:37:25

Git配置文件Linux

2023-09-26 01:03:36

Pandas數據數據集

2024-03-19 00:10:00

aiofilesPython開發

2021-07-26 05:07:23

Swift萬花尺代碼

2017-02-06 18:42:37

Linuxgdb程序

2022-07-25 07:57:19

工具代碼調試

2021-05-30 07:56:51

QSettingsLog4Qt變量

2021-10-09 10:50:30

JavaScript編程開發

2020-01-02 15:16:51

Nginx反向代理服務器

2022-01-17 07:50:37

Go代碼規范
點贊
收藏

51CTO技術棧公眾號

午夜久久福利影院| 国产亚洲精品免费| 欧美凹凸一区二区三区视频| 亚洲麻豆一区| 美女av免费观看| 国产女主播在线一区二区| 三级免费网站| 午夜精品久久久久久久99樱桃| www.在线播放| 亚洲免费中文字幕| 9999久久久久| 99精品国产一区二区| 久久99久久久久久久久久久| 免费观看成人网| 亚洲一区二区五区| 美女精品导航| 欧美交受高潮1| 欧美日韩 国产精品| 伊人网在线免费| 亚洲精品美国一| 国产1区在线| 久久久91精品国产一区不卡| 蜜臀久久99精品久久一区二区 | 亚洲高清在线观看一区| 丰满少妇久久久久久久| 免费在线观看麻豆视频| 日韩电影中文字幕一区| 精品国产一区二区三区久久久樱花| 久久一区二区精品| 久久综合999| 91在线播放网站| 综合av色偷偷网| 综合一区在线| 91热这里只有精品| 日韩美女视频在线| 天堂综合网久久| 亚洲最大免费| 午夜激情综合网| 亚洲午夜剧场| 久久久久久精| 99热这里只有精品首页| 亚洲影院污污.| 9i在线看片成人免费| 欧美色18zzzzxxxxx| 一区二区成人av| 精品成人久久| 91.·福利| 国产一区二区三区视频免费| 欧美三级第一页| 99在线免费视频| 中文字幕亚洲无线码a| 国产亚洲视频中文字幕视频| 美女精品在线| 欧洲免费在线视频| 亚洲电影中文字幕在线观看| 国产v综合v| 乱一区二区三区在线播放| 精品成人一区二区| av中文资源在线资源免费观看| 欧美中文字幕第一页| 色戒汤唯在线| 91免费看网站| 亚洲精品国产无天堂网2021| av在线不卡精品| 久精品国产欧美| 亚洲国产aⅴ成人精品无吗| 亚洲乱码中文字幕| 国产精品久久久久久久久久辛辛 | 免费人成在线不卡| 你懂得在线网址| 97色在线观看免费视频| 国产成人综合亚洲91猫咪| www免费在线观看| av成人综合网| 色综合激情久久| 99热精品久久| 一二三四社区在线视频| 久久久久久97| 欧美在线1区| gogogo高清在线观看一区二区| 一个人免费视频www在线观看| 一本一本久久a久久精品综合小说| 国产乱理伦片a级在线观看| 国模叶桐国产精品一区| av激情综合网| 欧美自拍电影| 国产女人18毛片| 精品视频在线播放色网色视频| 久久久久看片| 黄色免费网站在线| 国产精品一区在线播放| 欧美日韩亚洲视频| 亚洲男女av一区二区| 亚洲欧美一区二区三区在线播放| 热久久免费视频精品| 亚洲国产精品t66y| 99国产精品免费网站| 免费在线激情视频| 欧美国产日韩免费| 国产精品久线在线观看| 婷婷精品视频| 在线观看视频你懂的| 91网免费观看| 日韩一级二级三级| 国产资源精品在线观看| 亚洲播播91| 人妻有码中文字幕| 久久人人看视频| 夜夜操天天操亚洲| 国产中文一区| 丝袜在线视频| 黄色一级大片免费| 精品国产一区二区三区久久久狼| 91在线码无精品| 亚洲精品v亚洲精品v日韩精品| 一本色道久久亚洲综合精品蜜桃| 国产成人精品av在线| 色综合久久天天| 麻豆高清免费国产一区| 亚洲一区二区小说| 在线播放evaelfie极品| 日韩精品www| 91九色精品视频| 欧美日韩激情视频8区| 天堂在线中文网官网| 亚洲爆乳无码精品aaa片蜜桃| 色阁综合伊人av| 亚洲天堂免费看| 欧美精品国产| 625成人欧美午夜电影| 日韩欧美精品在线观看视频| 欧美在线观看日本一区| 91久久精品网| 国产精品一区二区在线播放| 精品亚洲二区| 久久久久久青草| 黄色一级视频播放| 琪琪亚洲精品午夜在线| 欧美日韩国产不卡| 国产成人精品一区二区三区四区| 欧美黑白配在线| 二区在线观看| 国产 日韩 欧美在线| 日韩美女免费观看| 亚洲а∨天堂久久精品9966| 欧美激情中文字幕一区二区| 黄色日韩在线| 亚洲专区**| 午夜小视频在线| 2018国产在线| 99视频免费观看| 久久精品国产欧美激情| 91高清视频在线| 2019国产精品| 国产欧美日本| 老牛影视av一区二区在线观看| 婷婷视频在线| 8848hh四虎| 中国一级黄色录像| 国产日韩欧美黄色| 亚洲视频视频在线| 色香蕉成人二区免费| 99久久精品一区| 亚洲精品乱码| 女厕嘘嘘一区二区在线播放 | av在线电影网| 欧美精品一区二区三区在线看午夜| 日韩在线观看免费全| 欧美最新大片在线看| 91麻豆精东视频| 日韩专区一卡二卡| 成人动漫免费在线观看| 成人久久久久爱| 91色视频在线| 国产日韩高清一区二区三区在线| а√中文在线天堂精品| 日本精品600av| 一区二区成人| 色戒在线免费观看| 日韩免费在线观看av| 豆国产97在线| 国产91免费看片| 久久久精品在线观看| 日韩午夜在线观看| 日本韩国一区二区三区| 国产精品久久久久久福利一牛影视| 狠狠色综合日日| 嫩草成人www欧美| 欧美一区二区三区另类| 亚洲第一福利专区| 日本一区二区乱| 日韩av超清在线观看| 黄色成人在线网| av网站大全在线观看| 在线观看免费网站| 97在线观看| 一道本在线免费视频| 欧美日本视频在线观看| 午夜一区二区三视频在线观看| 国产99在线播放|