實現ChromeDevtools除錯JavaScriptV8引擎

gclxry發表於2018-07-24

最近開發小程式JavaScript的執行時,通過在客戶端嵌入JavaScript V8引擎來實現。前端同學需要除錯JavaScript程式碼,正好Chrome瀏覽器的Devtools是與V8的Inspector除錯協議是一脈相承的,理論上是可以使用Chrome Devtools除錯JavaScript V8引擎。

V8的文件裡提到可以把Chrome Devtools作為偵錯程式的前端來除錯JavaScript。d8工程裡雖然有個例子,但是無法run起來。寫一下我實現。

v8-inspector1.PNG

InspectorAgent建立一個Websocket服務,假設開啟一個9224埠等待偵錯程式前端連線。Chrome瀏覽器開啟chrome-devtools://devtools/bundled/inspector.html?ws=127.0.0.1:9224就會呈現一個Devtools除錯頁面。點選頁面上的Reconncet DevTools按鈕,Devtools通過Websocket連線上InspectorAgent。InspectorAgent把來自Devtools的訊息通過v8_inspector::V8InspectorSession的dispatchProtocolMessage轉發給V8除錯後端。然後V8除錯後端通過v8_inspector::V8Inspector::Channel介面發訊息給Devtools。
InspectorAgent在中間僅僅扮演訊息轉發的角色。

v8-inspector2.PNG

這裡有兩個細節:

  • 在建立context的時候,需要指定一個名字,這個會在devtools的Sources欄顯示。不指定名字的話,則通過debugger:///VMXX找到,不夠方便
  • 偵錯程式的斷點,單步除錯支援,需要實現V8InspectorClient的runMessageLoopOnPause,quitMessageLoopOnPause等方法

最後效果如下圖:
v8-inspector3.PNG

v8-inspector4.PNG


相關文章