簡體   English   中英

遠程調試 V8 引擎(不是 Node.js 而是 ClearScript)

[英]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(通過切換到View->Debug 並按下配置按鈕——它會自動打開launch.json 文件)。
  • 從下面提供的代碼中添加最后 3 個配置。 調整是“協議”:“遺留”,即 5.4.x 版本使用 NodeJS < 8.x 版本和調試協議有很大不同。 CS V8 5.5.x 使用 "protocol" : "inspector" 和 "protocol" : "auto" 涵蓋兩者(猜測和調試協議的未來擴展)。

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 代碼是一件復雜的事情,但事實並非如此。 以下是執行此操作的說明:

  1. 設置 Visual Studio Code 編輯 settings.json 中的 Launch 配置,如“VII. 使用 ClearScript 和 V8 調試”中所述

  2. 使用V8ScriptEngineFlags.EnableDebugging + V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart選項啟動 V8 引擎

  3. 從 Visual Studio 或直接從編譯的可執行文件運行 C# 代碼; C# 代碼將暫停等待 Visual Studio Code 調試過程附加到它

  4. 在 Visual Studio Code 中開始調試(菜單調試 | 開始調試)

此時 VSCode 連接並在執行的第一個 JavaScript 行處停止,然后在所有"debugger;"處停止"debugger;" 命令。 當前腳本已加載並可調試,並且所有先前執行的腳本在 VSCode 中可見。

另見第 159 期第 24 期

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM