完整消息文本:目标进程在评估函数“function”时使用代码“code”退出。
为了更轻松地检查 .NET 对象的状态,调试器会自动强制调试的进程运行其他代码(通常是属性 getter 方法和 ToString 函数)。 在大多数情况下,这些函数会成功完成,或者引发可以被调试器捕获的异常。 但是,在某些情况下,由于异常跨越内核边界、需要用户消息泵送或无法恢复,因此无法捕获异常。 因此,属性 getter 或 ToString 方法中执行显式终止进程(例如调用 ExitProcess())或引发无法捕获的未经处理的异常(例如 StackOverflowException)的代码,将终止被调试的进程并结束调试会话。 如果您遇到此错误消息,则表示已经发生此问题。
此问题的一个常见原因是,当调试器评估调用自己的属性时,这可能会导致堆栈溢出异常。 无法恢复堆栈溢出异常,目标进程将终止。
更正此错误
此问题有两种可能的解决方案。
解决方案 #1:阻止调试器调用 getter 属性或 ToString 方法
错误消息显示调试器尝试调用的函数的名称。 使用该函数的名称,你可以尝试在即时窗口重新评估这一函数,以便进行调试。 从Immediate窗口进行评估时,可以进行调试,因为与自动/局部变量/监视窗口中的隐式评估不同,调试器会在出现未经处理的异常时暂停。
如果可以修改此函数,则可以阻止调试器调用属性 getter 或 ToString 方法。 请尝试以下选项之一:
将方法更改为除属性 getter 或 ToString 方法之外的其他类型的代码,并解决问题。
-或-
(对于
ToString)在类型上定义一个DebuggerDisplay属性,这样调试器就可以评估除ToString以外的内容。-或-
(对于属性 getter)将
[System.Diagnostics.DebuggerBrowsable(DebuggerBrowsableState.Never)]添加到该属性上。 如果你有一个需要因API兼容而保留为属性的方法,但实际上它更适合作为方法,这会很有用。
如果无法修改此方法,则可以在备用指令中中断目标进程,然后重试评估。
解决方案 #2:禁用所有隐式计算
如果前面的解决方案未解决问题,则可以禁用 “启用属性评估 ”功能。
打开“工具>选项”窗格,然后展开“所有设置>>”部分。 清除 “启用属性计算”和其他隐式函数调用 复选框。
打开 “工具>选项 ”对话框,然后展开 “调试>常规 ”部分。 清除 “启用属性计算”和其他隐式函数调用 复选框。
此更改会禁用大多数隐式函数计算,并应解决此问题。