繁体   English   中英

从第三方组件抛出StackOverflowException时如何中断我的源代码?

[英]How to break at my source code when StackOverflowException is thrown from third party component?

我的代码调用了第三方组件(我没有源代码访问权限),不幸的是, StackOverflowException是从第三方组件抛出的,当我查看堆栈跟踪时,所有第三方组件都在调用自身。

我什至不知道我的代码的哪一行调用了有问题的第三方方法,因为堆栈跟踪只由相同的第三方方法组成,而该第三方方法又一次调用了自身。

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

我总是可以尝试逐步调试,但是我的代码太杂乱了,我宁愿在万不得已时去做。

编辑:请注意,这与问题不同– C#捕获堆栈溢出异常 这与如何中断我的代码有关, 而不与如何捕获StackOverflow异常有关。

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

这里有更多详细信息: 了解我的代码

编辑:

是的,周杰伦,对您的误导性答案(未经检查)很抱歉。 我现在在VS 2015上进行了检查,发现了有趣的副作用,可以帮助您在代码中找到合适的位置。

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

在此处输入图片说明

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

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

因此,在进行了相当长的讨论之后(上),值得庆幸的是,我认为这实际上是不可能的。

根据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日志记录( 我曾经使用过postharp-上次检查是免费的-尽管现在可能不再如此了),以便将日志记录添加到继承代码中的所有方法边界,然后从最后一行开始日志记录的发生是在导致SO异常的第三方程序集中找到流氓调用。

暂无
暂无

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

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