【发布时间】:2013-04-09 08:35:34
【问题描述】:
我知道这很模糊,但我只能收集到这些。我希望有人对这可能发生的情况有所了解。
我有一个 64 位程序,我在 Win 7 64 位机器上运行,内置于 Visual Studio 2012。
它使用位于另一个项目中的类(编译为 dll)。该类有一个错误的迭代器,可能导致堆栈溢出。调用错误迭代器的操作是通过任务调用的。
所以在我的程序中,代码如下所示:
new Task(()=>{
try
{
DoWork(); //<-- buggy iterator is called inside
}
catch (Exception ex)
{
//Exception reported to user
}
}).Start();
代码每次都在相同的数据上执行,并且不涉及随机变量或 guid 生成,因此每次都应该产生相同的输出。
大多数时候,它会因 Unknown Module 中发生的 StackOverflowException 而崩溃(尽管我知道它究竟发生在哪里)。如果发生这种情况,我无法查看代码中发生溢出的点,并且 try-catch 块什么也不做!我无法继续执行程序(如果我在没有调试的情况下运行它,它会显示 “程序必须关闭,让我们在线检查解决方案” 系统窗口)。
现在,有时它会捕获异常(显示代码中导致异常的正确位置)。这是随机的,但如果我更频繁地中断任务(比如在任务工作期间随机插入断点),似乎会发生更多。
但是,我仍然无法继续申请。即使异常发生在应该捕获 StackOverflowException 的 try-catch 块内(它应该捕获它,因为 StackOverflowException 包含在 Exception 中 - C# 不会让您捕获两者并明确告诉您 SOE 已经包含在 E 中)。
我尝试制作一个小程序,在 try-catch 块内故意造成堆栈溢出,它还显示 “程序必须关闭,让我们在线检查解决方案” 系统窗口为我而不是正确处理。代码如下:
private bool Overflow()
{
return Overflow();
}
private void button1_Click(object sender, EventArgs e)
{
try { Overflow();}
catch (StackOverflowException ex) { }
}
因此,我有几个问题:
问题 1:
是否有可能捕获 StackOverflowExceptions?我该怎么做?
问题 2:
当您的 dll(同一解决方案中的其他项目)内部发生堆栈溢出时,什么可以让 VS 2012 调试器认为它是“未知模块”?
问题 3:
为什么用部落乐器做一些奇怪的魔法舞蹈会减少这样做的频率? (我的意思是随机中断正在进行的程序)
总的来说,发生了什么?
提前致谢
【问题讨论】:
标签: c# visual-studio visual-studio-2012 stack-overflow