我在看似无辜的代码中得到了StackOverflowException:
private void OnSelectedModelChanged(object sender, EventArgs eventArgs)
{
LoadNoticeDetails(); // Line #1
}
private void DoNothing()
{
// Never reaches here
}
private void LoadNoticeDetails()
{
if (SelectedModel == null) return; // Line #2
DoNothing(); Line #5
... // Never reaches here
}
private TModel _selectedModel;
public TModel SelectedModel
{
get
{
return _selectedModel; // Line #3
} // Line #4
....
}
我可以单步执行代码行#1 - #4 OK。但是,如果我进入第5行并等待半秒钟,则该过程终止:
Process is terminated due to StackOverflowException.
'blahblah.exe' (CLR v4.0.30319: blahblah.exe): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll'.
The program '[14936] blahblah.exe' has exited with code -2147023895 (0x800703e9).
(编辑)重现相同症状的第二种方法是在调试时用鼠标悬停在_selectedModel上。
请注意,实际的调用堆栈永远不会超过15-20行。我在以下情况中确认了这种行为:
我发现如果我删除所有断点并且不逐步执行代码,那么继续执行没有任何问题。
显然,这个问题会阻碍我们的调试工作,可能会掩盖一个更严重的问题。
导致这种情况的原因是什么?
答案 0 :(得分:4)
您的TModel类正在崩溃调试器评估线程。一个简单的例子:
using System;
class Program {
static void Main(string[] args) {
var obj = new TModel();
}
}
class TModel {
public override string ToString() {
return " " + ToString();
}
}
跳过 new 语句,并用鼠标悬停在“obj”变量上,或者让Locals或Autos调试器窗口可见,以使调试器使用borken ToString()方法。修复你的ToString()覆盖或调试器可视化工具(如果有的话)。