利用 GoLand 和 Mozilla rr 專案來除錯
偵錯程式。傳統上,它們被用來發現複雜的 bug 並解釋它們是如何發生的。但是,如果您無法解釋為什麼在步驟之間會發生一些更改,該怎麼辦呢?這就是典型偵錯程式無法幫助您的地方,因為它們通常只會讓您繼續執行。
正如我們在前一篇文章中所看到的,雖然可以使用 核心轉儲 ,但它們並不總是告訴您應用程式中發生的事情的全部情況。
輸入可逆的偵錯程式。這些偵錯程式不僅允許您在執行過程中逐步前進,還允許您返回並有效地撤消步驟之間的所有操作。
Go 偵錯程式 Delve 通過使用 Mozilla 的 rr 專案 支援此類功能。從 rr 專案的描述來看,它的任務是允許“在偵錯程式下反覆重播失敗的執行,直到完全理解它為止”。
讓我們看看實際情況。首先,rr 只能在 Linux 上執行,這是一些嚴格的限制。再加上 其他一些限制 ,確實影響了它的實用性。
有了這些,讓我們進入程式碼。我將使用一個簡單的應用程式來演示這些特性。
package main import ( "log" "net/http" ) func main() { c := http.Client{} resp, err := c.Head("htp://google.com") if err != nil { log.Fatalln("failed to make the request") } if resp.StatusCode != http.StatusOK { log.Fatalln("failed to make the request") } log.Println("the address is still working") }
如果我們執行它,它將列印“請求失敗”。在安裝 rr 之後,確保您執行所需的配置,以使 rr 執行 :
echo -1 | sudo tee -a /proc/sys/kernel/perf_event_paranoid echo 0 | sudo tee -a /proc/sys/kernel/kptr_restrict
這些設定不是永久的,如果重新啟動計算機,需要再次設定它們。現在讓我們開始實際除錯應用程式。
我將使用 GoLand 來執行 Delve 和 rr。這樣我就可以在幾次單擊執行它,並在執行除錯步驟時檢視原始碼和變數 / 記憶體內容,並嘗試瞭解發生了什麼。
建立專案後,單擊編輯器視窗左側設定斷點,然後單擊 “ main ” 函式旁邊的綠色箭頭,選擇 “ Record and Debug …” 選項。這將啟動所需的編譯步驟,然後使用 rr 後端啟動偵錯程式。
偵錯程式在斷點處停止後,現在可以返回執行。由於 rr 專案的工作方式,我們首先需要在前面的語句中放置第二個斷點,然後使用 “ Rewind ” 按鈕。現在,我們可以使用 “ Step into ”、“ Step over ” 等常規命令,或者使用 “ evaluate ” 功能對錶達式求值。
在繼續除錯應用程式的過程中,我們可以放置更多的斷點,通過跳過已知的良好區域或跳到程式碼的最後已知的良好部分來加速除錯。
下面是偵錯程式執行的一小段視訊 :
我希望這篇文章將幫助您發現一個新的、強大的工具,它可以加速發現和修復應用程式中的 bug。
不要忘記訪問 Delve 的倉庫,對其 star,甚至可能為這個了不起的專案做出貢獻。
如果您有任何評論或想了解更多,請使用下面的評論部分,或通過 Twitter @dlsniper 聯絡我。