繁体   English   中英

返回私有变量后的StackOverflowException,仅在单步执行代码时

[英]StackOverflowException after returning private variable, only while stepping through code

我在看似纯真的代码中得到了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代码行。 但是,如果我进入第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行。 我在以下情况下确认了此行为:

  • 调试/发布
  • 清洁解决方案并全部重建

我发现如果删除所有断点并且不单步执行代码,那么执行将继续进行而不会出现任何问题。

显然,此问题将阻碍我们的调试工作,并且可能掩盖了更严重的问题。

是什么原因造成的?

您的TModel类使调试器评估线程崩溃。 一个简单的例子:

using System;

class Program {
    static void Main(string[] args) {
        var obj = new TModel();
    }
}

class TModel {
    public override string ToString() {
        return " " + ToString();
    }
}

跳过语句,然后用鼠标悬停在“ obj”变量上,或者使“本地或自动”调试器窗口可见,以使调试器使用borken ToString()方法。 修复ToString()覆盖或调试器可视化器(如果有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM