溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語(yǔ)言之調(diào)試

發(fā)布時(shí)間:2020-07-01 17:52:05 來(lái)源:網(wǎng)絡(luò) 閱讀:4514 作者:baby神 欄目:編程語(yǔ)言

調(diào)試是一種技能,不限于我們說(shuō)的debug,這只是其中的一種,這是可以打斷點(diǎn)的調(diào)試,除此之外,還有打印輸出、日志記錄、單元測(cè)試,這都可以稱之為調(diào)試程序的手段。


打印輸出


打印輸出是一種比較傳統(tǒng)的調(diào)試手段,我們可以把我們需要了解的變量值,執(zhí)行的步驟等打印出來(lái),來(lái)證明我們的猜測(cè),以便解決問(wèn)題。


func min(a,b int) int {
    //調(diào)試輸出
    fmt.Println("a:",a,",b:",b)    
    if a>b { 
           return b  
  
} else {                   return a  
  
}
}


這是一個(gè)求最小值的函數(shù),其中的fmt.Println("a:",a,",b:",b) 就是我們加入的調(diào)試輸出語(yǔ)句,這樣我們就可以看到被比較的兩個(gè)數(shù)的值,進(jìn)而推測(cè)我們求最小值的算法是否正確。


打印輸出不僅可以輸出數(shù)值,還可以通過(guò)測(cè)試是否有輸出來(lái)判斷程序走了哪個(gè)邏輯,比如if語(yǔ)句,可能因?yàn)楸容^的錯(cuò)誤,程序進(jìn)入了另外一個(gè)if分支,那么我們就可以通過(guò)使用打印輸出來(lái)判斷。


日志輸出


這個(gè)和打印非常像,但是他比打印多了很多信息,比如發(fā)生時(shí)間,發(fā)生的代碼行數(shù)等,這種尤其在我們遇到線上問(wèn)題的時(shí)候尤其有用。


比如我們監(jiān)控到有一些部分用戶的登陸一直失敗,那么我們就就可以通過(guò)我們的日志文件里的日志,來(lái)定位時(shí)間、IP、用戶、錯(cuò)誤信息以及代碼行等,最終找到問(wèn)題,解決問(wèn)題。關(guān)于日志的適用可以參考我以前的一篇文章 http://www.flysnow.org/2017/05/06/go-in-action-go-log.html,這里就不再詳細(xì)介紹了。


GDB調(diào)試


GDB是一款類Unix下的調(diào)試器,可以幫助我們調(diào)試可執(zhí)行的程序,Go也對(duì)GDB進(jìn)行了支持,所以我們也可以適用GDB調(diào)試go程序。


GDB是命令行的工具,在調(diào)試前,我們要先編譯出我們需要調(diào)試的程序。使用go build -gcflags "-N -l" main.go即可進(jìn)行編譯。這里-N -l的標(biāo)記是忽略編譯器優(yōu)化的意思,這樣我們就可以更容易的調(diào)試程序。


調(diào)試通過(guò)gdb main啟動(dòng),會(huì)進(jìn)入一個(gè)GDB的調(diào)試界面,在這里面我們可以通過(guò)list命令查看代碼,可以通過(guò)b命令對(duì)某一行打斷點(diǎn),可以通過(guò)run命令運(yùn)行等,具體的可以參考GDB相關(guān)文檔,這里不做詳細(xì)介紹。


Delve調(diào)試


Delve是一個(gè)專門為調(diào)試Go程序而生的調(diào)試工具,它比GDB更強(qiáng)大,尤其時(shí)調(diào)試多goroutine高并發(fā)的Go程序。Delve的項(xiàng)目地址為https://github.com/derekparker/delve,它業(yè)績(jī)大部分Go開發(fā)IDE選用的調(diào)試工具,比如Goland,后面我們?cè)俳榻B。


Delve的使用和GDB非常像,都是命令行的工具,我們可以通過(guò)dlv debug main.go啟動(dòng),然后就會(huì)進(jìn)入一個(gè)交互界面,在這個(gè)界面里我們就可以進(jìn)行調(diào)試操作了。


Delve的一些常用命令如下:


1.break 打斷點(diǎn)


  1. continue 運(yùn)行到斷點(diǎn)處

  2. clear 刪除斷點(diǎn)

  3. list 顯示源代碼

  4. next 運(yùn)行到下一行

  5. locals 打印局部變量

  6. print 打印一個(gè)變量或者表達(dá)式

  7. exit 退出調(diào)試


除此之外,還有很多,大家可以參考Delve的文檔進(jìn)行調(diào)試。


IDE調(diào)試


對(duì)于調(diào)試來(lái)說(shuō),命令行下的太麻煩了,所以為了工具效率,建議大家使用IDE進(jìn)行調(diào)試,可見(jiàn),逐行,效率高。


調(diào)試這個(gè)事情,只要可以解決我們的問(wèn)題就好,有一個(gè)好的IDE可以幫助我們更高效率的調(diào)試,何樂(lè)不為呢。


這里推薦Goland,Jetbrains出品,老牌IDE廠商,非常方便。它家有很多IDE,而且快捷鍵都一樣了,會(huì)了一個(gè)其他的也都會(huì)了。


IDE調(diào)試非常簡(jiǎn)單,點(diǎn)擊工具欄的啟動(dòng)調(diào)試按鈕,就可以調(diào)試了,記得提前打上斷點(diǎn)。然后F8和F7配合就可以調(diào)試了,有專門的調(diào)試窗口可以看當(dāng)前的局部變量,堆棧信息等,很簡(jiǎn)單,這里不做詳細(xì)介紹了。


單元測(cè)試


單元測(cè)試也是一種調(diào)試的手段,我們可以模擬很多場(chǎng)景來(lái)驗(yàn)證我們邏輯的正確性,遇到問(wèn)題,打印輸出等,所以也是一種調(diào)試的手段


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI