我们有一个大型 ASP.NET 应用程序,偶尔会由于 StackOverflowException
而崩溃。因为这些aren't handled very elegantly by .NET ,我们被简化为事后调试,没有任何正常的异常日志和堆栈跟踪。一旦我们找到问题发生的位置,通常很容易解决;困难的部分是精确定位代码库中错误发生的位置。
我们在崩溃后获得的进程转储文件似乎对这项工作有很大帮助,但到目前为止,我们还无法弄清楚如何最好地使用它。您可以(非常非常缓慢地)使用 Visual Studio“调试”该过程,但这基本上需要永远加载 MSFT 符号,然后不会加载我们的应用程序 DLL 的符号(因此您看不到有趣的部分)调用堆栈)。
似乎必须有一个简单的方法:
- 故障转储文件
- 设置托管应用程序 DLL/PDB
到完整的托管调用堆栈;任何人都可以描述(或指出教程)执行此操作(使用 VS、WinDbg 或任何其他工具)吗?
最佳答案
是的,有一种方法可以获取托管堆栈,等等......
您正在寻找的是 WinDbg 的 SOS.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
关于c# - 如何从 ASP.NET 进程转储到托管调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23505370/