Debug Console 表达式卡死是因调试器进程被同步执行挂起,非网络问题;它通过 DAP evaluate 请求同步执行、无超时重试与沙箱,JSON.stringify、同步 I/O、await、proto 展开等操作均会触发卡死。

Debug Console 里输入表达式后光标转圈、几秒弹出 Evaluation timed out,不是网络慢,是调试器进程被你写的表达式挂起了。
为什么 Debug Console 表达式一跑就卡死
VSCode 的 Debug Console 不是 REPL,它走的是 DAP 协议的 evaluate 请求路径:你敲完回车 → 请求发给调试器进程 → 调试器同步执行 → 序列化结果 → 返回。整个链路没有超时重试、没有沙箱、不支持中断。
一旦表达式触发以下任一行为,调试器进程就会卡住,5–10 秒后 DAP 连接强制断开:
-
JSON.stringify(largeObj)—— 尤其含循环引用或 10k+ 属性的Map/Set - 展开
obj.__proto__或点开大型对象的 proto 面板(Debug Console 内部会递归序列化) -
require('fs').readFileSync('./huge.log')或任何同步 I/O -
await fetch(...)—— Node.js 调试器默认不支持异步evaluate,await会直接挂住 -
process.memoryUsage()—— 某些 V8 版本下会隐式触发 GC 扫描,耗时不可控
哪些操作在 Debug Console 里绝对不能碰
这些看似“ harmless ”的操作,在 Debug Console 里本质是远程同步执行,极易拖垮整个调试上下文:
- 对未裁剪的
Array或Object直接调用JSON.stringify() -
Object.keys(obj).map(k => obj[k])类链式遍历 —— 可能隐式触发 getter / Proxy trap - 访问
globalThis.process或globalThis.Buffer的某些字段 —— 部分读取会触发内部模块初始化 -
document.querySelectorAll(...)(浏览器环境)—— 若 DOM 已部分销毁,可能死锁
真要查大对象?别硬刚 evaluate
Debug Console 不是日志终端,也不是调试器的 dump 工具。想看内容,就换条路走:
- 在代码里加
console.log(JSON.stringify(obj, null, 2)),输出到 TERMINAL 的 Debug 标签页 —— 这里走 stdout,无超时,支持折叠/搜索 - 设断点暂停后,在 VARIABLES 面板右键变量 → Copy Value —— 它用轻量序列化路径,不走 DAP
evaluate - 需要结构化查看?把对象赋给全局变量再用浏览器 DevTools 查:
window.debugMe = obj,然后切到浏览器控制台操作(仅限浏览器调试)
Debug Console 卡死后怎么救
卡死 ≠ 调试会话崩溃,但 DAP 连接已断,此时:
- 别狂按回车或重连调试器 —— 这会让状态更混乱
- 先确认调试器是否还活着:打开命令面板 → 输入
Developer: Toggle Developer Tools→ Console 里搜DAP或disconnect - 如果看到
Connection closed或evaluate request timeout,说明连接已断;此时只能重启调试会话(Stop → Start Debugging) - 若频繁发生,立刻检查
launch.json是否误配了skipFiles或启用了trace: true(后者会大幅加重序列化负担)
最常被忽略的一点:你以为是表达式太重,其实问题出在某个 getter 里调了 fs.readFileSync 或发了未 await 的 Promise —— 这类副作用根本不会报错,只会静默卡死。











