[英]Remote debug V8 Engine (not Node.js but ClearScript)
我正在使用Microsoft.ClearScript.V8在 C# 控制台應用程序中嵌入一個簡單的 V8 引擎實例。 我想遠程調試 Google Chrome devtools 中發生的事情,但我失敗了。
搜索interwebz,我能找到的唯一解決方案是安裝Eclipse 並從那里進行調試。 然而這是不希望的。 我想了解后台發生了什么並能夠重現該功能。
我已經知道遠程調試器通過 WebSockets 進行通信,但我不知道實現細節。 你們能否在這里指出我正確的方向?
我的代碼:
int debugPort = 8888;
var ctx = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging, debugPort);
ctx.AllowReflection = true;
/* This is not required but allows me to console log things. */
ctx.AddHostType("Console", typeof(Console));
當我嘗試使用 V8 檢查器 ( https://chrome.google.com/webstore/detail/nodejs-v8-inspector/lfnddfpljnhbneopljflpompnkfhggl ) 進行連接時,出現以下錯誤:
無法在位置 0 的 JSON 中啟動調試器意外令牌 T
這是完全合理的,因為它需要一個 JSON 格式的字符串,因為 Node 以這種方式實現它。
當我在瀏覽器中打開http://127.0.0.1:8888/時,我收到以下輸出:
Type: connect
V8-Version: 5.3.332.45
Protocol-Version: 1
Embedding-Host: V8Runtime
Content-Length: 0
如何從 Google Devtools 遠程調試我的非 Node 應用程序?
這是答案的一部分(而不是答案)。
到目前為止,我已經花了 2 天的時間嘗試相同的方法,並發現 ClearScript 不使用 node 來調試 javascript 代碼 =/=。
已設法運行 node.exe 並附加調試器:節點進程列表輸出為( http://127.0.0.1:9229/json/list ):
[ {
"description": "node.js instance",
"faviconUrl": "https://nodejs.org/static/favicon.ico",
"id": "574da142-2ee2-44da-a912-03f96868339c",
"title": "Administrator: IA-32 Visual Studio 2008 mode - node --inspect[6416]",
"type": "node",
"url": "file://"
} ]
但它看起來不像 ClearScript.V8 設備( http://127.0.0.1:9222/ ):
Type: connect
V8-Version: 5.5.372.40
Protocol-Version: 1
Embedding-Host: V8Runtime
Content-Length: 0
和你的類似。
進一步閱讀 V8 實現了它自己的調試協議,我沒有找到任何明確的文檔。 所有的互聯網都有點點滴滴,但沒有什么是完整的。 我已經在 Chrome Dev Tools 中設法識別遠程設備,但除此之外沒有檢查設備的選項,不知道為什么(可能是因為我們都使用舊版本的 ClearScript 5.4.x)。 CDT > 遠程設備:遠程目標 #127.0.0.1 / 目標(就是這樣,沒有按鈕,沒有鏈接,什么也做不了)。
最后的希望是在某種程度上構建我自己的檢查器,如果沒有的話,至少可以看到 js 堆棧跟蹤(這最初是我的目標)。
--- 編輯:總結並完成答案(對於 op、我和其他人):
找到了可以正常工作的“Microsoft 代碼”。 只需稍微調整配置示例,閱讀他們的幫助,就可以了。 加載腳本源、斷點、控制台,一切正常(如宣傳的那樣)。
如何:
下載 Microsoft 代碼(我使用了 zip 包 - 無需安裝) https://code.visualstudio.com/
運行 Microsoft Code,創建工作區(將在那里創建 launch.json 文件)
launch.json 源代碼:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program (NodeJS)",
"program": "${workspaceRoot}/bin/Debug/",
"cwd": "${workspaceRoot}",
},
{
"type": "node",
"request": "attach",
"name": "Attach by Process ID",
"processId" :"${command:PickProcess}",
"cwd": "${workspaceRoot}",
},
// works with 5.5.x V8 Runtime
{
"type": "node",
"request": "attach",
"name": "Attach to CSV8:9222 (Inspector)",
"protocol": "inspector",
"address": "127.0.0.1",
"port": 9222,
},
// works with 5.4.x V8 Runtime
{
"type": "node",
"request": "attach",
"name": "Attach to CSV8:9222 (Legacy)",
"protocol": "legacy",
"address": "127.0.0.1",
"port": 9222,
},
// works with 5.4.x and 5.5.x V8 Runtime
{
"type": "node",
"request": "attach",
"name": "Attach to CSV8:9222 (Auto)",
"protocol": "auto",
"address": "127.0.0.1",
"port": 9222,
},
]
}
運行您的 ClearScript 應用程序(確保您已啟用調試,並且調試端口匹配)。
從 Microsoft Code Debug 工具欄中選擇 Attach to CSV8:9222 (Auto) 並按運行。 此時 MS Code 將加載所有遠程 JS 源代碼。 你可以選擇源並在那里放置斷點。 調試就像宣傳的那樣工作。
希望這對你也有幫助
您至少需要ClearScript 5.5 。 舊版本不支持 V8 Inspector 協議。 最新版本 (5.5.2) 適用於 chrome://inspect 並修復了一些錯誤。
閱讀https://stackoverflow.com/a/50695896/5288052似乎使用 ClearScript 和 Visual Studio Code 本地調試 JavaScript 代碼是一件復雜的事情,但事實並非如此。 以下是執行此操作的說明:
設置 Visual Studio Code 編輯 settings.json 中的 Launch 配置,如“VII. 使用 ClearScript 和 V8 調試”中所述
使用V8ScriptEngineFlags.EnableDebugging
+ V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart
選項啟動 V8 引擎
從 Visual Studio 或直接從編譯的可執行文件運行 C# 代碼; C# 代碼將暫停等待 Visual Studio Code 調試過程附加到它
在 Visual Studio Code 中開始調試(菜單調試 | 開始調試)
此時 VSCode 連接並在執行的第一個 JavaScript 行處停止,然后在所有"debugger;"
處停止"debugger;"
命令。 當前腳本已加載並可調試,並且所有先前執行的腳本在 VSCode 中可見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.