监视面板仅在调试会话激活、断点命中且处于当前栈帧时才求值有效表达式;否则显示“Cannot evaluate”或空值,其作用域严格受限于当前执行上下文。

监视面板不是“加了就自动好用”的被动窗口,它只在调试会话中激活、只在当前栈帧里求值、只对合法表达式返回结果——不满足任一条件,就会显示 Cannot evaluate 或空值。
断点必须命中,监视才开始工作
没进断点,Watch 面板里的表达式不会刷新;即使你提前加好了 user.items.length,它也一直显示旧值或 not available。这不是 bug,是设计逻辑:VSCode 只在暂停瞬间对当前执行上下文做一次求值。
- F5 启动调试后,顶部必须出现橙色调试工具条(含暂停/继续按钮),否则
Watch不处于活跃状态 - 断点设在异步回调里(如
setTimeout内部),却在同步代码处暂停 → 监视项无法访问回调内变量 - 函数已 return、作用域已退出,再看该函数内的局部变量 → 显示
Cannot evaluate
表达式必须能在当前栈帧里求值
监视不是全局搜索器,它不会跨函数、跨闭包、跨异步任务去“找”变量。你在 handleClick 里设断点,就不能直接输 fetchResult ——除非它确实是 handleClick 的局部变量或闭包变量。
- 右键悬停变量名 → “添加到监视” 是最可靠方式,它自动提取当前作用域可见的完整路径(如
state.user?.profile?.theme) - 手动输入时禁用副作用:不要写
saveToDB()、console.log()、print(),这些可能被多次调用或根本无返回值 - 嵌套访问务必用可选链:
response?.data?.items[0]?.id比response.data.items[0].id更安全,避免因中间某层为null导致整个表达式崩掉
Python 调试需额外确认 launch.json 配置
Python 用户最容易卡在这一步:Watch 显示 undefined 或空白,大概率不是代码问题,而是调试器没加载对上下文。
- 检查
launch.json中是否包含"console": "integratedTerminal"—— 缺失或写成"internalConsole"(尤其 macOS)会导致变量命名空间隔离 -
"program"字段必须指向实际运行的文件,比如你 F5 运行的是app.py,但配置里写的是"${workspaceFolder}/main.py",监视就会失效 - 确保安装的是 Microsoft 官方 Python 扩展,旧版第三方扩展可能不支持现代调试协议
真正难的不是加表达式,而是判断“此刻这个变量到底在不在当前作用域里”。与其反复试错,不如暂停后先看一眼 Variables 面板里的 Local 区块——如果那里都找不到,Watch 里也别指望它凭空出现。


















