godebug:一個跨平臺的Go程式除錯工具

TP_funny發表於2015-04-23
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
  • 無法附上一個正在執行的程式
  • 開始前必須要知道你索要除錯的包
來自:CSDN
相關閱讀
評論(1)

相關文章