【问题标题】:Remote debug V8 Engine (not Node.js but ClearScript)远程调试 V8 引擎(不是 Node.js 而是 ClearScript)
【发布时间】:2017-07-14 10:28:54
【问题描述】:

我正在使用Microsoft.ClearScript.V8 在 C# 控制台应用程序中嵌入一个简单的 V8 引擎实例。我想远程调试 Google Chrome 开发工具中发生的事情,但我失败了。

搜索 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/lfnddfpljnhbneopljflpombpnkfhggl) 进行连接时,我收到以下错误:

无法启动调试器 JSON 中位置 0 处的意外标记 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 应用程序?

【问题讨论】:

    标签: javascript v8 devtools


    【解决方案1】:

    您至少需要ClearScript 5.5。旧版本不支持 V8 Inspector 协议。最新版本 (5.5.2) 支持 chrome://inspect 并修复了一些错误。

    【讨论】:

    • 谢谢,我花了 2 天时间才弄明白。问题实际上是 ClearScript 5.5.x 使用 .NET 4.5,我有 .NET 4.0 并且无法升级......长篇大论......但是今天已经弄清楚如何运行旧版本。为其他有类似问题的人编辑了上面的答案。无论如何再次感谢;)
    【解决方案2】:

    阅读https://stackoverflow.com/a/50695896/5288052 似乎使用 ClearScript 和 Visual Studio Code 对 JavaScript 代码进行本地调试是一件复杂的事情,但事实并非如此。以下是执行此操作的说明:

    1. "VII. Debugging with ClearScript and V8"中所述,设置Visual Studio Code 编辑settings.json 中的Launch 配置

    2. 使用 V8ScriptEngineFlags.EnableDebugging + V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart 选项启动 V8 引擎

    3. 从 Visual Studio 或直接从编译的可执行文件运行 C# 代码; C# 代码将暂停等待 Visual Studio Code 调试进程附加到它

    4. 在 Visual Studio Code 中开始调试(菜单调试 | 开始调试)

    此时 VSCode 连接并在执行的第一行 JavaScript 处停止,然后在所有 "debugger;" 命令处停止。当前脚本已加载并可调试,之前执行的所有脚本都在 VSCode 中可见。

    另请参阅 Issue 159Issue 24

    【讨论】:

      【解决方案3】:

      这是答案的一部分(而不是答案)。

      到目前为止,我已经花了 2 天时间尝试相同的方法,并发现 ClearScript 不使用节点来调试 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 开发工具中设法识别远程设备,但除此之外,没有检查设备的选项,不知道为什么(也许我们都使用旧版本的 ClearScript 5.4.x)。 CDT > Remote Devices: Remote Target #127.0.0.1 / Target(就是这样,没有按钮,没有链接,什么都做不了)。

      最后的希望是在某种程度上构建我自己的检查器,以至少查看 js 堆栈跟踪(如果没有的话)(这原本是我的目标)。

      --- 编辑:结束并完成答案(对于 op、我和其他人):

      找到可以正常工作的“Microsoft 代码”。对配置示例进行了一些调整,阅读了他们的帮助,但使它起作用了。 加载脚本源、断点、控制台,一切正常(如宣传的那样)。

      如何:

      • 下载 Microsoft 代码(我已使用 zip 包 - 无需安装) https://code.visualstudio.com/

      • 运行 Microsoft Code,创建工作区(将在那里创建 launch.json 文件)

      • 编辑launch.json(通过切换到查看->调试并按下配置按钮-它会自动打开launch.json文件)。
      • 从下面提供的代码中添加最后 3 个配置。调整是“protocol”:“legacy”,即 5.4.x 版本使用 NodeJS

      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 代码调试工具栏中选择附加到 CSV8:9222(自动)并按运行。此时 MS Code 将加载所有远程 JS 源代码。您可以选择源并将断点放在那里。调试工作就像宣传的那样。

      希望对你也有帮助

      【讨论】:

        猜你喜欢
        • 2018-04-29
        • 1970-01-01
        • 2021-12-24
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        • 2014-02-05
        相关资源
        最近更新 更多