调试时无法定位异常代码行?生成.pdb文件仍未解决
先看一下你提到的代码:
public class Program { public static void Main(string[] args) { try { DoWork(); //<- This method will throw exception } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } }
你遇到的这个调试痛点我太懂了——有try/catch的时候直接跳catch,没try/catch就进中断模式,明明开了Full Debug信息也生成了pdb,就是没法直接跳到异常行看变量。别着急,给你几个便捷的解决办法:
开启“异常抛出时立即中断”
按Ctrl+Alt+E打开Visual Studio的「异常设置」窗口,找到你关注的异常类型(比如最通用的Exception),勾选「抛出时」的复选框。这样不管代码里有没有try/catch,只要异常一被抛出,调试器会立刻停在抛出异常的那一行,直接就能查看上下文变量,不用再去catch里翻堆栈。检查“仅我的代码”设置
有时候「仅我的代码」会屏蔽掉非你编写的代码调试,导致异常位置被跳过。你可以去「工具 -> 选项 -> 调试 -> 常规」里,取消勾选「启用仅我的代码」(如果之前是勾选状态的话)。这样调试器能追踪到所有代码的执行,确保不会漏掉异常发生的位置。确认pdb文件正确加载
虽然你已经生成了pdb,但可以验证下调试时是否真的加载成功:调试过程中按Ctrl+Alt+U打开「模块」窗口,找到你的程序集,查看「符号状态」是不是显示「已加载」。如果没加载,右键点击程序集选择「加载符号」,手动指定pdb文件的路径就能解决。重新抛出异常用
throw;而非throw ex;
要是你有在catch里重新抛出异常的需求,千万不要用throw ex;——它会重置堆栈跟踪,丢失原始异常的位置信息。改用throw;就能保留完整的堆栈调用链,调试器能准确找到最初抛出异常的代码行。
内容的提问来源于stack exchange,提问作者Charanoglu

