使用windbg进行.NET转储分析

3
我正在使用Windbg和psscor2.dll扩展程序来调试一个.NET 3.5 CLR转储文件。导致异常的代码如下:
try 
{
 ...
}
catch
{
 ...
}
catch
{
 ...
}
finally
{
 ...
 // exception I found in the dump happened here.
 ...
}

好的,使用!pe命令出现了空引用异常。问题的真正原因可能在try块或其中一个catch块中发生的异常被finally块中的异常掩盖了。应用程序在压力测试中崩溃,因此很难创建重现,所以转储就是我所有的信息。

那么,对于所有windbg/.NET内部专家,我的问题是:您是否有任何想法如何获得在finally块之前发生的异常?我在堆栈(!dso命令)中没有看到任何有用的信息,那基本上就是我对psscor2的了解。

谢谢。


3
不,那些信息已经丢失了。运行附带调试器的压力测试是一个非常简单的解决方法。使其停止在第一次机会异常上。 - Hans Passant
1
很遗憾,这里不能运行压力测试。这是一种比较复杂的基础设施,测试是在实验室中进行的。我除了可重现的问题之外没有其他东西。我希望上面抛出的异常仍然存在于堆栈/堆中的某个地方。我猜它仍然存在于转储文件中,但我不知道在哪里找到它。感谢您的评论。 - Klark
如果你还没有尝试过,可以使用 !dae(DumpAllExceptions)和“!Analysis”命令来处理转储文件。最后使用 !analyze -v 命令。也许你会在输出中看到一些东西。 - Kjell Gunnar
我尝试了 !dae。!analyze 在处理托管转储时效果不佳。最终,我在十六进制编辑器中打开了一个转储文件,并搜索了“exception”关键字和异常周围的一些方法。它只发现了那些 nullreferenceexceptions,所以 Hans Passant 是正确的。谢谢。 - Klark
如果你很幸运的话,你可能能够在堆中找到该实例。然而,你基本上必须搜索堆中任何异常的实例(并记住你会找到错误的结果)。我不知道如何将隐藏的异常链接到finally块中的异常,但你可以从堆栈跟踪中定位它。 - Brian Rasmussen
如果你有机会再次运行压力测试,可以尝试使用intellitrace记录你的代码。这将为你提供更多关于过去事件的信息。 - Tim Cools
1个回答

1
  1. 使用windbg附加到您的进程,执行"sxe clr"并等待任何空引用1st chance异常,然后使用!pe命令检查调用堆栈。
  2. 您可以使用"!dumpheap -type Exception"查找名称包含单词"Exception"的对象,然后找到NullReferenceException对象,使用.foreach(ex {!dumpheap -short -mt }){!pe ex}
  3. 您可以从!dso或!clrstack -a中找到参数或局部变量

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接