我们有一个大型的ASP.NET应用程序偶尔因StackOverflowException
而崩溃。因为这些aren't handled very elegantly by .NET,我们在没有任何常规异常日志和堆栈跟踪的情况下被简化为事后调试。一旦我们找到问题发生的位置,通常很容易修复;困难的部分是指向代码库中发生错误的位置。
我们在崩溃后获得的进程转储文件似乎对这项工作有很大帮助,但到目前为止,我们还无法弄清楚如何最好地使用它。你可以(非常非常,慢慢地)"调试"使用visual studio的过程,但这基本上需要永远加载MSFT符号,然后不会加载我们的应用程序DLL的符号(所以你不能看到调用堆栈的有趣部分)。
似乎必须有一种直截了当的方式:
到完整的托管调用堆栈;任何人都可以描述(或指向教程)这样做(使用VS,WinDbg或任何其他工具)?
答案 0 :(得分:2)
是的,有办法获得托管堆栈,还有更多..
您正在寻找的是WinDbg的 SOS.dll 调试器扩展程序。 SOS.dll调试器扩展位于安装.NET框架的同一文件夹中(即C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ SOS.dll)
将SOS.dll加载到WinDbg后,您可以查询:
答案 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
可能会产生误导。