如何从ASP.NET进程转储到托管调用堆栈?

时间:2014-05-06 22:09:28

标签: c# windbg crash-dumps stack-overflow postmortem-debugging

我们有一个大型的ASP.NET应用程序偶尔因StackOverflowException而崩溃。因为这些aren't handled very elegantly by .NET,我们在没有任何常规异常日志和堆栈跟踪的情况下被简化为事后调试。一旦我们找到问题发生的位置,通常很容易修复;困难的部分是指向代码库中发生错误的位置。

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

似乎必须有一种直截了当的方式:

  • 崩溃转储文件
  • 设置托管应用程序DLL / PDB

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

2 个答案:

答案 0 :(得分:2)

是的,有办法获得托管堆栈,还有更多..

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

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

  • 托管调用堆栈:!clrstack
  • 托管主题:!主题
  • 堆叠(本地)变量!clrstack -l <​​/ strong>
  • 函数调用参数!clrstack -p
  • 有关对象的信息!do address
  • 内存消耗!dumpheap
  • 对象保存对内存地址的引用!gcroot address
  • 托管锁!syncblk

这是cheat-sheet with commands to get around using sos.dll

答案 1 :(得分:0)

你应该采用这种方法:

确保您拥有正确的符号

.symfix d:\symbols

在WinDbg中加载.NET扩展

.loadby sos clr
.loadby sos mscorwks

选择带有异常的线程

~#s

打印例外

!pe

和callstacks

!clrstack
!dumpstack

如果您在使用SOS或mscordacwks版本时遇到问题,因为转储不是来自同一台计算机,请使用Mscordacwks Collector从服务器获取正确的版本。

另请注意,预先分配了一个StackOverflowException,但不一定会抛出。像

这样的命令的输出
!dumpheap -stat -type StackOverflowException

可能会产生误导。