大家好,今天為大家帶來Ubuntu下,使用GDB斷點調試Go程序。由於之前沒有接觸過GDB調試,而Go語言本身內置也沒有什么調試工具,不像Eralng,有Debugger可以使用,我從網上搜索了下,也沒有相關的中文教程,所以這邊自己研究了下,給新手帶來一篇關於GDB簡單調試Go程序的文章。(關於GDB的文章還是不少的)
首先,編寫測試代碼,如下:
package main import ( "fmt" ) func main() { fmt.Printf("%s\n", "hello, world") printNumber() } func printNumber() { var count int; count = 10 sum := 0 for i := 0; i < count; i++ { sum = sum + i fmt.Printf("i = %d, sum = %d\n", i, sum) } }
編譯,並運行程序(Ubuntu下的Sublime Text 2,如果你也想用這個工具,可以參看我令一篇文章:Ubuntu下使用Sublime Text 2搭建Go開發環境):
go build main.go
./main
好了,現在我們就可以開始使用GDB調試,生成的main應用程序了,這里為了快速找到應用程序,我把該程序和代碼放置到 ~/ 目錄下。
一,使用GDB加載應用程序,打開終端,輸入 gdb main,如下圖:
這里注意最后兩行:
Reading symbols from /home/administrator/main...done.
Loading Go Runtime support.
讀取main程序完成和加載Go運行時。
二,輸入 l 命令,相當於list,從第一行開始列出源碼,如下圖:
認真的朋友,會發現main.go代碼,並沒有完整的顯示在這里,怎么回事呢?
這里我們直接再敲個回車,就會產生如下圖的結果:
還是不完整,再來個回車呢?
現在已經完整了,如果再來個回車呢?
這個時候,根據提示,我們就知道代碼已經全部顯示出來了。
三,設置斷點,並顯示斷點信息:
輸入 break 8,表示在第8行,設置一個斷點。
輸入 break printNumber,表示在函數 printNumber 函數入口處,設置一個斷點,這里如圖沒有設置成功,需要輸入 break main.printNumber。感謝朋友JamCode和mikespook的幫助。
輸入 break 14,表示在第14行,設置一個斷點。
輸入 info break,表示查看斷點信息。
如圖:
四,運行程序,並調試。
輸入 r,運行程序,run命令簡寫,程序將停止第8行斷點處,如下圖:
使用 n,單條語句執行,next命令簡寫。
使用 c,繼續運行程序(跳過當前斷點),continue命令簡寫。
使用bt,查看函數堆棧。
使用finish,退出函數。
下面是我簡單調試的結果:
這里最后還有個疑問,當我使用 p,輸出 count,和 sum 值的時候,它的值很奇怪,麻煩知道的朋友留言告知,謝謝。