VS2017:断点触发超时,如何定位涉事函数及方法名来源?
嘿,我来帮你拆解这个调试时遇到的头疼问题~
一、对话框里的方法名来自哪里?
那个弹窗里的System.NullReferenceException.NullReferenceException,其实是**NullReferenceException异常类的默认构造函数的完全限定名**。
当调试器触发断点后,会自动尝试对当前上下文里的变量、属性进行求值展示。如果此时代码上下文刚好涉及到NullReferenceException的实例化或者异常信息的获取,调试器就会调用这个构造函数来完成求值操作。一旦这个过程因为进程状态异常、内存访问阻塞或者复杂调用栈等原因卡住,超过了调试器的默认超时阈值,就会弹出那个超时提示。
二、保留属性求值功能的解决办法
既然属性求值对你的调试效率帮助很大,那咱们可以试试这些方案来规避超时问题:
调大求值超时阈值:
打开VS2017的工具 -> 选项 -> 调试 -> 常规,找到“属性求值和其他隐式函数调用”区域里的“求值超时时间(毫秒)”,把默认的数值(通常是1000ms)适当调高,比如改成3000ms,给调试器足够的时间完成复杂的属性求值操作。缩小自动求值的范围:
勾选“启用‘仅我的代码’”选项(同样在调试 -> 常规里),这样调试器会跳过系统框架代码的自动求值,只聚焦你自己编写的代码,减少不必要的求值操作。另外,在调试 -> 选项 -> 调试 -> 符号里,只加载你需要的符号文件,避免过多符号加载拖慢求值速度。手动按需求值:
遇到容易触发超时的断点时,先不要让调试器自动展开所有变量属性。你可以用“即时窗口”手动输入要查看的变量或属性名,按需触发求值;或者右键变量选择“快速监视”,单独对特定变量进行求值,避免批量自动求值带来的卡顿。排查进程状态异常的根源:
弹窗里提到“可能已损坏目标进程”,你可以检查下代码里是否存在内存泄漏、unsafe代码块里的不安全指针操作,或者多线程场景下的资源竞争问题——这些情况都可能导致进程状态不稳定,进而让调试器的求值操作卡住。
内容的提问来源于stack exchange,提问作者BenjiFB

