远程调试 V8 引擎(非 Node.js 而是 ClearScript)

4
我正在使用Microsoft.ClearScript.V8在C#控制台应用程序中嵌入一个简单的V8引擎实例。我想远程调试Google Chrome开发工具中发生的情况,但我失败了。
在互联网上搜索,我能找到的唯一解决方案是安装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)进行连接时,出现以下错误: 无法启动调试器 位置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应用程序?

3个回答

2

阅读https://dev59.com/hJ_ha4cB1Zd3GeqPynB7#50695896,看起来使用ClearScript和Visual Studio Code进行JavaScript代码的本地调试是一件复杂的事情,但实际上并不是。以下是操作说明:

  1. 根据"VII. Debugging with ClearScript and V8"中所述,在settings.json文件中设置Visual Studio Code编辑启动配置

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

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

  4. 在Visual Studio Code中启动调试(菜单Debug | Start Debugging)

在这一点上,VSCode 连接并停留在第一条执行的 JavaScript 行,然后在所有 "debugger;" 命令处停留。当前脚本已加载且可调试,所有先前执行的脚本都可在 VSCode 中看到。
另请参见 问题 159问题 24

1

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

到目前为止,我已经花了两天时间尝试同样的事情,并且发现ClearScript不使用node来调试JavaScript代码 = /。

已经成功运行了node.exe并附加了调试器: node进程列表输出为(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>远程设备:Remote Target #127.0.0.1 / Target(就这样了,没有按钮、链接或其他操作)。

最后的希望是自己构建一个检查器,以某种程度上至少看到js堆栈跟踪(这最初是我的目标)。

---编辑:为了总结和完成答案(为op、我和其他人):

发现了一个正确运作的东西“Microsoft Code”。需要进行一些配置示例的微调,阅读他们的帮助文档,但使其正常工作。 加载脚本源代码、断点、控制台,一切都像广告中说的那样顺利。

如何:

  • 下载 Microsoft Code(我选择了 zip 包 - 无需安装)https://code.visualstudio.com/

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

  • 通过切换到“视图->调试”并按配置按钮来编辑 launch.json(它会自动打开 launch.json 文件)。
  • 从下面提供的代码中添加最后三个配置。调整是“protocol”:“legacy”,即 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(自动),然后按运行。此时,MS Code将加载所有远程JS源代码。您可以选择源并在那里设置断点。调试正如所宣传的那样有效。

希望这也能对您有所帮助。


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

谢谢,我花了两天时间才解决这个问题。问题实际上是ClearScript 5.5.x使用的是.NET 4.5,而我只有.NET 4.0,无法升级...长话短说...但今天我已经找到了如何运行旧版本的方法。我已经编辑了上面的答案,供其他遇到类似问题的人参考。 总之,再次感谢;) - SoLaR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接