2

我们有一个大型的 ASP.NET 应用程序,它偶尔会因为StackOverflowExceptions 崩溃。因为.NET 不能很好地处理这些问题,所以我们只能在没有任何正常异常日志和堆栈跟踪的情况下进行事后调试。一旦我们找到问题发生的位置,通常很容易解决;困难的部分是指出错误发生在代码库的哪个位置。

我们在崩溃后获得的进程转储文件似乎对这项工作有很大帮助,但到目前为止,我们一直无法弄清楚如何最好地使用它。您可以(非常、非常、缓慢地)使用 Visual Studio“调试”该过程,但这基本上需要永远加载 MSFT 符号,然后不会为我们的应用程序 DLL 加载符号(因此您看不到有趣的部分调用堆栈)。

似乎必须有一个简单的方法:

  • 故障转储文件
  • 设置的托管应用程序 DLL/PDB

到完整的托管调用堆栈;任何人都可以描述(或指向教程)这样做(使用 VS、WinDbg 或任何其他工具)吗?

4

2 回答 2

2

是的,有一种方法可以获取托管堆栈,等等。

您正在寻找的是WinDbg的SOS.dll调试器扩展。SOS.dll 调试器扩展位于安装 .NET 框架的同一文件夹中(即 C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll)

将 SOS.dll 加载到 WinDbg 后,您可以查询:

  • 托管调用堆栈:!clrstack
  • 托管线程:!threads
  • 堆栈(局部)变量!clrstack –l
  • 函数调用参数!clrstack -p
  • 关于对象的信息!做地址
  • 内存消耗!dumpheap
  • 对象持有对内存地址的引用!gcroot地址
  • 托管锁!syncblk

这是一个备忘单,其中包含使用 sos.dll 的命令

于 2014-05-06T22:13:06.637 回答
0

你应该用这种方法走得很远:

确保你有正确的符号

.symfix d:\symbols

在 WinDbg 中加载 .NET 扩展

.loadby sos clr
.loadby sos mscorwks

选择有异常的线程

~#s

打印异常

!pe

和调用堆栈

!clrstack
!dumpstack

如果您对 SOS 或 mscordacwks 的版本有疑问,因为转储不是来自同一台机器,请使用Mscordacwks Collector从服务器获取正确的版本。

另请注意,总是预先分配一个 StackOverflowException,但不一定会抛出。类似命令的输出

!dumpheap -stat -type StackOverflowException

可能会产生误导。

于 2014-05-07T06:51:45.973 回答