我正在使用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应用程序?
答案 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源代码:
{
// 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应用程序(确保您已启用调试,并且该调试端口匹配)。
选择附加到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代码进行本地调试是一件很复杂的事情,但并非如此。以下是执行此操作的说明:
设置Visual Studio代码,如"VII. Debugging with ClearScript and V8"
使用V8ScriptEngineFlags.EnableDebugging
+ V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart
选项启动V8引擎
从Visual Studio或直接从已编译的可执行文件运行C#代码; C#代码将暂停,等待Visual Studio Code调试过程附加到它上
在Visual Studio Code中启动调试(菜单Debug | Start Debugging)
这时,VSCode连接并在执行的第一行JavaScript行处停止,然后在所有"debugger;"
命令处停止。当前脚本已加载且可调试,并且所有先前执行的脚本在VSCode内部均可见。