Visual Studio调试器运行时异常修复原因后能否继续执行代码?
Visual Studio调试遇到运行时异常,修复诱因后能否不重启调试继续执行?
针对.NET Framework场景、以及Visual Studio通用调试能力的相关问题,完全可以在不重启调试进程的前提下,修复异常诱因后继续运行代码,这套能力本身就是Visual Studio调试器从很早的版本就内置支持的功能,你举的FileNotFound异常的场景是非常典型的适用案例。
FileNotFound异常场景下的完整操作流程
- 当代码抛出FileNotFound异常被调试器捕获时,程序会默认停在异常抛出的代码行处,保持调试进程的挂起状态
- 直接在本地文件系统创建代码预期读取的目标文件,把文件放到代码查找的对应路径下,满足代码的读取条件
- 通过调试器的执行指针回溯能力,把停在异常抛出位置的黄色执行箭头,拖拽回文件读取逻辑的起始代码行位置
- 点击继续调试按钮,程序就会重新执行修正完外部条件的读取逻辑,正常跑完后续流程。整个过程会保留之前调试会话的所有内存状态、断点配置、实时监视值,完全不需要从头开始调试。
操作的适用边界与注意事项
- 这套回溯执行的操作,最适配外部依赖缺失、参数取值不符合预期这类没有造成系统状态污染的异常场景。如果异常已经触发了不可回滚的状态变更(比如已经执行了一半的数据库提交、已经打开未释放的非托管文件句柄),需要先手动清理这些脏状态,再回溯执行位置,否则很容易触发新的异常
- 调试器的回溯操作有明确限制:不能跨线程边界跳转执行位置,也不能跳转到当前调用栈以外的代码行,否则调试器会弹出非法操作的提示
- 手动触发回溯的常用方式有两种:直接在代码行左侧的 gutter 区域拖拽黄色执行箭头;或者在目标代码行上点击右键,选择
设置下一语句(对应快捷键为Ctrl+Shift+F10) - 如果当前调试的程序集开启了编译优化、或者是在.NET Framework下加载了经过NGen预编译的原生镜像,可能会出现
设置下一语句选项置灰不可用的情况。此时只需要在项目属性的编译配置里关闭优化代码选项,重新编译调试版本即可解锁该能力 - 整个操作过程不需要改动代码本身,因此不会触发程序集的重新加载,调试会话的所有上下文都会保持连续,不会打断之前的调试节奏。
内容的提问来源于stack exchange,提问作者Bigbob556677
相关产品推荐
相关产品推荐

