我试图在我自己的调试器上实现NodeJS调试API服务器。我想使用任何能够调试Node的客户端通过我自己的调试器进行调试。我使用Visual Studio Code作为测试调试客户端,我能够实现足够的消息交换来附加,设置断点并通知VSC脚本在断点处暂停。问题是,Visual Studio代码更改"暂停"图标到"播放"表示执行暂停,但它似乎无法理解代码停止的断点。没有突出显示断点。并且它不会从服务器请求帧或堆栈跟踪。在最后一次VSC代码更新之前,它还会显示在堆栈跟踪窗口顶部暂停执行的消息,在上次更新后,该消息不会显示,但执行仍然暂停。
这是服务器和VSC之间的消息交换日志(从断点请求开始):
Request:
{
"command": "setbreakpoint",
"arguments": {
"line": 4,
"column": 0,
"type": "scriptRegExp",
"target": "^(.*[\\/\\\\])?\\/Users\\/me\\/Documents\\/github\\/test\\/test\\.js$"
},
"type": "request",
"seq": 8
}
Response:
{
"seq": 9,
"type": "response",
"success": true,
"running": true,
"request_seq": 8,
"command": "setbreakpoint",
"body": {
"type": "scriptRegExp",
"breakpoint": 1,
"script_regexp": "^(.*[\\/\\\\])?\\/Users\\/me\\/Documents\\/github\\/test\\/test\\.js$",
"line": 4,
"column": 0,
"actual_locations": [
{
"line": 4,
"column": 4,
"script_id": 42
}
]
}
}
Response:
{
"type": "event",
"event": "break",
"body": {
"sourceLine": 4,
"sourceColumn": 4,
"sourceLineText": " var product = Product.get(params.pid.stringValue);",
"breakpoints": [
1
],
"script": {
"id": 42,
"name": "/Users/me/Documents/github/test/test.js",
"lineOffset": 0,
"columnOffset": 0,
"lineCount": 458
}
}
}
Request:
{
"command": "threads",
"type": "request",
"seq": 10
}
Response:
{
"seq": 11,
"type": "response",
"success": true,
"running": false,
"request_seq": 10,
"command": "threads",
"body": {
"totalThreads": 1,
"threads": [
{
"current": true,
"id": 4
}
]
}
}
之后,VSC不再发送任何请求。我做错了吗?也许有人可以指出一些应该验证VSC节点调试的单元测试的位置?
此外,虽然Node对它进行响应,但线程请求似乎并未出现在NodeJS调试器API规范中。它是新的,还是只是未记录的功能?
答案 0 :(得分:1)
https://code.visualstudio.com/docs/extensionAPI/api-debugging的以下部分解释了在遇到断点时会发生什么:
“每当程序停止时(在程序输入时,由于遇到断点,发生异常,或者用户请求执行暂停),调试适配器必须发送具有适当原因和线程ID的已停止事件。收到后,VS Code将请求给定线程的堆栈跟踪(堆栈帧列表)。如果用户随后钻入堆栈帧,VS Code首先请求堆栈帧的范围,然后请求范围的变量。变量本身是结构化的,VS代码通过其他变量请求来请求它的属性。这导致了以下层次结构:...“
调试适配器测试在这里:https://github.com/Microsoft/vscode-node-debug/blob/master/src/tests/adapter.test.ts 他们测试典型的VS Code场景。您可能希望查看“应该在断点处停止”测试(第108行)。
为了节省空间,“停止原因”现在显示在CALL STACK视图的标题中: