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

标签 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 或任何其他工具)吗?

最佳答案

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

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

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

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

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

关于c# - 如何从 ASP.NET 进程转储到托管调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23505370/

相关文章:

.net - WinDbg SOS异常堆栈中函数地址旁边的+0x10是什么意思?

c# - 使用 windbg 时有没有办法中断特定的 CLR 异常

c++ - 生成迷你文本转储 LInux

.net - 如何使用 SOS 读取字符串?

windows-7 - Windbg 故障转储分析

C#/WinForm - TreeView 节点 : Add to variable and compare

c# - 在 Visual Studio 2012 中使用 newton.jsoft (json.net) 将 c# 翻译为 vb .net 时出现翻译错误

c# - 为平板电脑和 WindowMobile 开发 winforms 应用程序

c# - Telnet 服务器 -> 退格键/删除不起作用

debugging - 如何在WinDbg中设置符号?