這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。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上的地址點此進入。