Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用windbg进行.NET转储分析_C#_.net_Debugging_Windbg_Crash Dumps - Fatal编程技术网

C# 使用windbg进行.NET转储分析

C# 使用windbg进行.NET转储分析,c#,.net,debugging,windbg,crash-dumps,C#,.net,Debugging,Windbg,Crash Dumps,我正在使用windbg和扩展调试.NET3.5CLR转储。 发生异常的代码如下所示: try { ... } catch { ... } catch { ... } finally { ... // exception I found in the dump happened here. ... } 好的,用!pe命令我有一个异常。这是一个空引用异常,但问题的真正原因是在try或某个捕获中的某个位置,在finally块中发生的异常被这个异常掩盖。应用程序在压力测试中崩溃了,所以创

我正在使用windbg和扩展调试.NET3.5CLR转储。 发生异常的代码如下所示:

try 
{
 ...
}
catch
{
 ...
}
catch
{
 ...
}
finally
{
 ...
 // exception I found in the dump happened here.
 ...
}
好的,用
!pe
命令我有一个异常。这是一个空引用异常,但问题的真正原因是在try或某个捕获中的某个位置,在finally块中发生的异常被这个异常掩盖。应用程序在压力测试中崩溃了,所以创建一个复制程序并不容易,所以转储就是我的一切

所以,这里是所有windbg/.NET内部专家的问题。你知道我如何在finally块中获取在此之前发生的异常吗。我在堆栈上看不到任何有用的东西(
!dso
命令),这或多或少就是我的psscor2知识的终点:)

谢谢

  • 将windbg attatch用于您的进程,执行“sxe clr”,等待任何空引用第一次机会异常并使用!pe命令检查调用堆栈
  • 您可以使用“!dumpheap-type Exception”来查找名称中包含单词“Exception”的对象,然后查找NullReferenceException对象,使用.foreach(ex{!dumpheap-short-mt}{!pe ex}
  • 您可以从中找到参数或局部变量!dso或!clrstack-a

  • 不,那个信息落入了比特桶。运行带有调试器的压力测试是一个非常简单的解决方法。让它在第一次机会出现异常时停止。不幸的是,运行压力测试在这里不是一个选项。这是一种复杂的基础设施,测试是在实验室里进行的。除了复制品,我什么都没有。我希望上面抛出的异常仍然在堆栈/堆的某个地方。我想它仍然在垃圾堆的某个地方,但我只是不知道在哪里可以找到它。谢谢你的评论。如果你还没有准备好,试试看!用于转储文件的dae(DumpAllExceptions)和“!Analysis”命令。终于有机会了!分析-v。也许你在输出中看到了什么,我试过了!dae!analyze不能很好地处理托管转储。最后,我在一个十六进制编辑器中打开了一个转储文件,并搜索了“exception”关键字和一些关于异常的方法。它只发现了那些NullReferenceException,所以Hans Passant是正确的。谢谢。如果幸运的话,您可以在堆上找到实例。但是,您基本上必须在堆中搜索任何异常的实例(请记住,您将发现误报)。我不知道如何将隐藏的异常链接到finally块中的异常,但是您可以从堆栈跟踪中找到它。