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



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

搜索interwebz,我能找到的唯一解决方案是安装Eclipse并从那里进行调试。 但是,这是不希望的。我想了解后台发生的情况并能够重现该功能。

我已经知道远程调试器通过 WebSocket 进行通信,但我不知道实现细节。你们能在这里为我指出正确的方向吗?

我的代码:

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 远程调试我的非节点应用程序?

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

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

  1. 设置 Visual Studio Code 在 settings.json 中编辑启动配置,如"VII.使用 ClearScript 和 V8 进行调试">

  2. 使用V8ScriptEngineFlags.EnableDebugging+V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart选项启动 V8 发动机

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

  5. 在Visual Studio Code中启动调试(菜单调试|开始调试)

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

另见问题 159 和问题 24。

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

到目前为止,我已经花了 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,me和其他人):

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

如何:

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

  • 运行Microsoft代码,创建工作区(将在此处创建启动.json文件)

  • 编辑launch.json(通过切换到View->Debug并按配置按钮 - 它会自动打开launch.json文件)。
  • 从下面提供的代码中添加最后 3 个配置。调整是"协议":"遗留"即5.4.x版本使用NodeJS<8.x版本和调试协议有很大不同。CS V8 5.5.x使用"协议":"检查器"和"协议":"自动"涵盖了它们(猜测和调试协议的未来扩展)。

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源代码。您可以选择源并将断点放在其中。调试的工作方式与宣传的一样。

希望这也对你有帮助

最新更新