当从第三方组件抛出StackOverflowException时,如何破坏我的源代码?

时间:2017-05-26 06:16:42

标签: c# visual-studio-2015

我的代码调用第三方组件(我没有源代码访问权限),不幸的是,StackOverflowException从第三方组件抛出,当我查看堆栈跟踪时,它全部是第三方派对组件自称。

我甚至无法分辨出我的代码中哪一行调用了违规的第三方方法,因为堆栈跟踪只包含相同的第三方方法调用自身,一遍又一遍。

当从第三方组件抛出StackOverflowException时,如何使VS2015调试器在我的源代码中断?这有可能吗?

我总是可以尝试一步一步的调试,但我的代码非常混乱,我宁愿在最后的手段上这样做。

修改:请注意,这与问题 - C# catch a stack overflow exception不同。这与如何破坏我的代码和 而不是 如何捕获StackOverflow异常有关。

2 个答案:

答案 0 :(得分:1)

通常选项Debugging-> General->启用Just My Code应该可以解决问题。你应该标记它,然后调试器应该停在你的代码而不是第三方库。但是,您可能需要满足更多条件,例如删除.pdb文件。

这里有一些更多细节: Understanding Just My Code

编辑:

是的,周杰伦你没有检查就误导了误导性答案。我现在在VS 2015上查了一下,我找到了有趣的副作用,它可以帮助你在代码中找到合适的位置。

在显示异常窗口后,代码中的位置用灰色矩形标记。这意味着如果在调试会话期间打开包含挂起组件调用的源代码的所有窗口,则应该可以看到异常发生的位置。

enter image description here

似乎VS由于缺少堆栈而无法进入调试模式,但只是在挂起正确的行之前标记了。

条件:源文件必须打开。因此,如果文件的数量包含调用此"坏"外部代码是合理的,这可能会有所帮助。

答案 1 :(得分:1)

经过相当长时间的讨论(上图) - 我值得一提的是,我认为这实际上并不可行。

According to MSDN,StackOverflowException将终止你的进程......

Starting with the .NET Framework 2.0, you can’t catch a StackOverflowException object with a try/catch block, and the corresponding process is terminated by default.

如果您的进程终止,则无法将调试器指回源代码。那是因为没有参考。一个简单的例子:

class Program 
{ 
   static void Main(string[] args) 
   { 
      Foo(); 
   } 

   static void Foo() 
   { 
      Foo(); 
   } 
}

上述程序将进入无限循环并抛出Stackoverflow异常。您(应该)收到一条消息,告知您的进程已终止,调试器将显示没有堆栈跟踪信息

最后一部分很重要;如果没有堆栈跟踪信息 - 您(或者更确切地说是调试器)无法将堆栈向上移回代码。

在没有PDB文件的发布模式下构建同一个示例(并使其公开)并从第二个控制台应用程序引用它模仿OP的问题 - 调用第三方代码而没有引发SO异常的源。

当我这样做时,我在调试器中看到除了System.StackOverflowException was unhandled Message: An unhandled exception of type 'System.StackOverflowException' occurred in SoTest.exe之外没有其他信息(如果我启用'只是我的代码'也是如此) - 程序随后终止并且我没有指针过程终止的地方。

我建议实现AOP日志记录(I have used postsharp - 上次我检查时是免费的 - 虽然可能不再是这种情况)将日志记录添加到继承的代码中的所有方法边界,然后从步骤最后一行日志记录发生在第三方程序集中发现导致SO异常的恶意调用。