如何避免 debugpy 调试时求值数据库属性?
数据小许
结论
PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT 用于设置慢属性警告的阈值。它不会取消属性访问超时。将它设为 0,不能据此认为属性求值会被关闭,也不能指望它中断正在执行的数据库查询。debugpy 没有可在 launch.json 中配置的通用选项,能按对象或当前栈帧禁止属性求值。
调试器检查对象属性时,pydevd 的默认解析器会调用 getattr(),可能触发 @property 等描述符。访问完成后,解析器才会记录耗时并检查是否需要报告慢属性。因此,警告出现时,耗时操作已经发生。pydevd 属性解析器 launch.json 已列出的调试选项中,也没有通用的“禁用属性求值”开关。debugpy 调试配置
调整警告阈值
可以在对应的 launch.json 配置中设置环境变量。这个变量只决定何时触发慢访问警告,不会让 getter 提前返回:
{
"name": "Python: Current File",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"env": {
"PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT": "2"
}
}
这里的 2 表示将警告阈值设为 2 秒。实际单位以及 0 的边界行为可能因 pydevd 版本而异,因此不要把 0 当作取消或禁用属性访问的方法。警告中显示的 30.00s 是该次访问的耗时,单凭这条警告无法判断这个耗时上限是否由该变量控制。
避免调试器触发数据库查询
- 在 VS Code 的 Variables 面板中,不要展开会触发查询的对象。检查其他局部变量时,也要避免将该对象放入自动求值的监视表达式或调试表达式。
- 如果对象的实例字段存放在
__dict__中,可以尝试在 Debug Console 中查看vars(obj),其中只会显示已存储的字段。@property计算出的属性通常不在vars(obj)中;使用__slots__的对象也未必有__dict__。 - 如果需要在调试时查看对象状态,可以将数据库访问改为显式方法调用,或缓存查询结果。这样调试器读取属性时就不会执行数据库操作。具体调整方式取决于对象的实现。
如果对象没有展开、也没有被监视,慢访问警告却仍然出现,可以检查 VS Code 的 Watch 列表、断点条件和调试表达式,看其中是否引用了该对象或它的属性。调整警告阈值无法阻止这些表达式执行。
备注:内容仅供参考。
