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

时间:2017-02-23 19:15:06

标签: javascript v8 devtools

我正在使用Microsoft.ClearScript.V8在C#控制台应用程序中嵌入一个简单的V8引擎实例。我想远程调试谷歌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/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 个答案:

答案 0 :(得分:0)

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

到目前为止,我已经花了两天时间尝试相同的事情,并且发现了这一点 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>远程设备:远程目标#127.0.0.1 /目标(以及它,没有按钮,没有链接,无法完成任何操作)。

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

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

找到正常工作的内容" Microsoft Code"。它只是对配置示例进行了一些调整,阅读了它们的帮助,但使其工作。 加载脚本源,断点,控制台,一切正常(如宣传的那样)。

如何:

  • 下载Microsoft Code(我已经使用了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使用"协议" :"督察"和"协议" :" 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工具栏中选择
  • 选择附加到CSV8:9222(自动),然后按运行。在这一刻MS Code将加​​载所有远程JS源代码。你可以选择源并在那里放置断点。 Debuging的工作方式与宣传的一样。

希望这对你也有帮助

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 设置Visual Studio代码,如"VII. Debugging with ClearScript and V8"

  2. 中所述,在settings.json中编辑启动配置
  3. 使用V8ScriptEngineFlags.EnableDebugging + V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart选项启动V8引擎

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

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

这时,VSCode连接并在执行的第一行JavaScript行处停止,然后在所有"debugger;"命令处停止。当前脚本已加载且可调试,并且所有先前执行的脚本在VSCode内部均可见。

另请参阅Issue 159Issue 24