調試是一種技能,不限於咱們說的debug,這只是其中的一種,這是能夠打斷點的調試,除此以外,還有打印輸出、日誌記錄、單元測試,這均可以稱之爲調試程序的手段。html
打印輸出是一種比較傳統的調試手段,咱們能夠把咱們須要瞭解的變量值,執行的步驟等打印出來,來證實咱們的猜想,以便解決問題。git
func min(a,b int) int { //調試輸出 fmt.Println("a:",a,",b:",b) if a>b { return b
} else { return a
}
}
這是一個求最小值的函數,其中的fmt.Println("a:",a,",b:",b) 就是咱們加入的調試輸出語句,這樣咱們就能夠看到被比較的兩個數的值,進而推測咱們求最小值的算法是否正確。github
打印輸出不只能夠輸出數值,還能夠經過測試是否有輸出來判斷程序走了哪一個邏輯,好比if語句,可能由於比較的錯誤,程序進入了另一個if分支,那麼咱們就能夠經過使用打印輸出來判斷。算法
這個和打印很是像,可是他比打印多了不少信息,好比發生時間,發生的代碼行數等,這種尤爲在咱們遇到線上問題的時候尤爲有用。併發
好比咱們監控到有一些部分用戶的登錄一直失敗,那麼咱們就就能夠經過咱們的日誌文件裏的日誌,來定位時間、IP、用戶、錯誤信息以及代碼行等,最終找到問題,解決問題。關於日誌的適用能夠參考我之前的一篇文章 http://www.flysnow.org/2017/05/06/go-in-action-go-log.html,這裏就再也不詳細介紹了。ide
GDB是一款類Unix下的調試器,能夠幫助咱們調試可執行的程序,Go也對GDB進行了支持,因此咱們也能夠適用GDB調試go程序。函數
GDB是命令行的工具,在調試前,咱們要先編譯出咱們須要調試的程序。使用go build -gcflags "-N -l" main.go便可進行編譯。這裏-N -l的標記是忽略編譯器優化的意思,這樣咱們就能夠更容易的調試程序。高併發
調試經過gdb main啓動,會進入一個GDB的調試界面,在這裏面咱們能夠經過list命令查看代碼,能夠經過b命令對某一行打斷點,能夠經過run命令運行等,具體的能夠參考GDB相關文檔,這裏不作詳細介紹。工具
Delve是一個專門爲調試Go程序而生的調試工具,它比GDB更強大,尤爲時調試多goroutine高併發的Go程序。Delve的項目地址爲https://github.com/derekparker/delve,它業績大部分Go開發IDE選用的調試工具,好比Goland,後面咱們再介紹。單元測試
Delve的使用和GDB很是像,都是命令行的工具,咱們能夠經過dlv debug main.go啓動,而後就會進入一個交互界面,在這個界面裏咱們就能夠進行調試操做了。
Delve的一些經常使用命令以下:
1.break 打斷點
continue 運行到斷點處
clear 刪除斷點
list 顯示源代碼
next 運行到下一行
locals 打印局部變量
print 打印一個變量或者表達式
exit 退出調試
除此以外,還有不少,你們能夠參考Delve的文檔進行調試。
對於調試來講,命令行下的太麻煩了,因此爲了工具效率,建議你們使用IDE進行調試,可見,逐行,效率高。
調試這個事情,只要能夠解決咱們的問題就好,有一個好的IDE能夠幫助咱們更高效率的調試,何樂不爲呢。
這裏推薦Goland,Jetbrains出品,老牌IDE廠商,很是方便。它家有不少IDE,並且快捷鍵都同樣了,會了一個其餘的也都會了。
IDE調試很是簡單,點擊工具欄的啓動調試按鈕,就能夠調試了,記得提早打上斷點。而後F8和F7配合就能夠調試了,有專門的調試窗口能夠看當前的局部變量,堆棧信息等,很簡單,這裏不作詳細介紹了。
單元測試也是一種調試的手段,咱們能夠模擬不少場景來驗證咱們邏輯的正確性,遇到問題,打印輸出等,因此也是一種調試的手段