godebug:一個跨平臺的Go程式除錯工具
godebug是一個跨平臺的Go程式除錯工具,傳統的編譯型語言偵錯程式使用底層系統呼叫並讀取二進位制檔案用於除錯各類符號。使用起來很麻煩而且很難移植。
godebug使用不同的方法,直接把原始碼作為目標程式,在每一行插入除錯程式碼,然後編譯並執行。結果就是一個全功能的偵錯程式,完全可以移植到不同平臺。事實上,由於有了gopherjs ,你也可以在瀏覽器上進行除錯:
點選此處嘗試原文除錯視窗。通過原文的“DEBUG IT”按鈕,你可以編輯程式並重新除錯它。
工作原理
下面這張是描述上面例子的向量圖:
從中可以看出原始程式碼轉換了兩次:第一次godebug插入除錯instrumentation,然後gopherjs將結果編譯成JavaScript。
讓我們看一下instrumentation步驟,以下是godebug插入的呼叫:
- godebug.EnterFunc:讓godebug執行時庫知道我們在進入一個函式。由於“next”不停止內部函式呼叫,執行時庫注意這些呼叫並知道何時跳過這些行。
- godebug.ExitFunc:讓godebug執行時庫知道我們在離開一個函式,main中省略。
- godebug執行時庫:當且僅當使用者用命令或一個斷點告知其時,使程式暫停並等待輸入,暫停時,它會提示使用者輸入並響應任何命令。
- godebug.Declare:記錄變數名和值的對映。該對映通過輸出命令使用。
使用godebug
Step 1.安裝
Step 2.設定斷點
在任何想要斷點的地方新增這個標記:
由於斷點是原始碼的一部分,你可以將自己的邏輯置於他們周圍。假設你正在執行一個表格驅動多情況測試,其中一個測試輸入“weird string”的情況是失敗的,那麼你可以將下面這個斷點放入測試當中:
godebug test將於標記處暫停程式,方便定位。
Step 3.執行程式
使用godebug執行命令:
或者對測試來說 ,執行測試命令:
預設情況下,godebug只會新增除錯instrumentation到package main(為了godebug執行)或者測試下的package(為了godebug測試)。這意味著在預設情況下,你無法進入來自匯入包的函式。當需要的時候,執行下面這個行命令:
最後
godebug仍然還是一款需要打磨的新工具,目前存在的已知限制包括:
- 效能開銷
- 可能會導致讀取衝突,如果你的程式讀取自stdin
- 無法附上一個正在執行的程序
- 開始前必須要知道你索要除錯的包
其在GitHub上的地址點此進入。