我试图在VS Code(v.1.24.0)中调试Node / Express TypeScript应用程序,并且在调试期间我的所有断点都显示为灰色。
错误是"未验证的断点,断点已设置但尚未绑定。"我已经搜索了但无法弄清楚我的配置有什么问题。控制台中没有错误,调试器在我选择进程时成功附加,但断点不起作用。
如何调试?
基本文件夹结构:
/.vscode
/src/server.ts
/dist/server.js
launch.json
tsconfig.json
launch.json
{
"type": "node",
"request": "attach",
"name": "Attach by Process ID",
"processId": "${command:PickProcess}",
"protocol": "inspector",
"address": "localhost",
"port": 8080,
"restart": true,
"preLaunchTask": "npm: build",
"sourceMaps": true,
"outFiles" : [ "${workspaceFolder}/dist/**/*.js" ]
},
tsconfig.json
{
"compilerOptions": {
"alwaysStrict": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"module": "commonjs",
"moduleResolution": "node",
"target": "es6",
"outDir": "dist",
"rootDir": "src",
"sourceMap": true,
"typeRoots": [ "node_modules/@types" ]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
tasks.json
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "build",
"group": {
"kind": "build",
"isDefault": true
}
} ]
答案 0 :(得分:5)
对于遇到此错误的任何人,我都能找到解决方案。问题是我启动Node进程的方式,而不是源映射的映射(产生不同的错误)。
要附加到进程,我从VS Code终端启动它,如下所示:
node --inspect dist/server.js
launch.json:
{
"type": "node",
"request": "attach",
"name": "Attach by Process ID",
"processId": "${command:PickProcess}",
"protocol": "inspector",
"address": "localhost",
"port": 8080,
"restart": true,
"preLaunchTask": "npm: build",
"sourceMaps": true,
"outFiles" : [ "${workspaceRoot}/dist/**/*.js" ]
},
答案 1 :(得分:0)
我今天遇到了这个问题,我尝试重新构建并重新运行调试器。我关闭了所有VS Code实例,然后重新启动,现在可以正常工作。
答案 2 :(得分:0)
我发现我试图在一个文件中设置的所有断点都出现了此问题,但其余问题都没有。
我用小写字母命名了dispatcher.js文件,但使用以下命令将其拉入节点:
const { Dispatcher } = require('./Dispatcher')
,内容是一个javascript类,导出为:
module.exports = { Dispatcher }
答案 3 :(得分:0)
我在使用vscode 1.25时遇到了这个问题
看起来像是在调试会话运行时更改了包含断点的源(.ts)时触发的。可以通过重新保存源代码或重新切换断点来重新启用断点。
但是如果更改了源,则必须重新启动调试才能与源同步。
此问题似乎也蔓延到“编辑”模式,即使退出“调试”模式,断点仍将保持“未验证”状态。同样,在这种情况下,重新保存源似乎可以重新启用断点。
答案 4 :(得分:0)
我遇到了同样的问题;如果存在错误,调试器将报告该错误,但是如果没有错误,它将不会在断点处停止。对我来说解决的更改是指定将要提供的确切文件名,而不只是本地主机。例如,在NodeJS上,Express仅指定localhost:3000
不会在我的断点处停止,而是指定localhost:3000/index.html
可以按预期工作
完整配置,可以按预期(迄今为止)在断点处停止:
我的文件夹在VSCode:learningPixi
中打开,具有完整的文件夹位置(Ubuntu Linux):/home/leigh/node/pixi-tut/learningPixi
我的文件夹结构是:
/home/leigh/node/pixi-tut/learningPixi/.vscode/launch.json
/home/leigh/node/pixi-tut/learningPixi/public/index.html
/home/leigh/node/pixi-tut/learningPixi/server.js
launch.json文件的内容
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:3000/index.html",
"webRoot": "${workspaceFolder}/public",
"skipFiles": ["pixi.min.js"]
}
]
}
“ skipFiles”也非常有用,否则调试器会进入每个函数调用
我的(非常基本的)快速服务器配置仅用于调试静态文件中的JavaScript:
const express = require('express');
const path = require('path');
const app = express();
app.use(express.static(path.join(__dirname, '/public')));
app.listen(3000, () => console.log('App started on port 3000'));
并按照上述文件夹结构,确保index.html位于/ public文件夹中
如果从HTML文件中调试JavaScript,则可能还需要转到VSCode中的设置并启用:允许断点无处不在
答案 5 :(得分:0)
对于将来的读者:我遇到了这个问题,因为在尝试调试之前我已经运行了我的应用程序的产品构建。 prod版本删除了VS Code成功调试所需的源映射,因此我运行了我的应用程序的dev版本,然后进行调试,一切正常。