【发布时间】:2014-05-06 22:09:27
【问题描述】:
我们有一个大型 ASP.NET 应用程序,它偶尔会由于 StackOverflowExceptions 而崩溃。因为这些aren't handled very elegantly by .NET,我们被简化为事后调试,没有任何正常的异常日志和堆栈跟踪。一旦我们找到问题发生的位置,通常很容易解决;困难的部分是指出错误发生在代码库中的哪个位置。
我们在崩溃后获得的进程转储文件似乎对这项工作有很大帮助,但到目前为止,我们一直无法弄清楚如何最好地使用它。您可以(非常、非常、缓慢地)使用 Visual Studio“调试”该过程,但这基本上需要永远加载 MSFT 符号,然后不会为我们的应用程序 DLL 加载符号(因此您看不到有趣的部分调用堆栈)。
似乎必须有一条直截了当的方法:
- 故障转储文件
- 设置托管应用程序 DLL/PDB
到完整的托管调用堆栈;任何人都可以描述(或指向教程)这样做(使用 VS、WinDbg 或任何其他工具)吗?
【问题讨论】:
-
我很想知道您在哪些领域发现了这些异常。我不记得曾经在 ASP.NET 中发现过 StackOverflowException。
-
@JohnSaunders:我们看到的一个例子是开发人员使用 Aggregate 和 Concat 而不是 SelectMany 组合一堆列表。最近的案例似乎是一个非常复杂的查询导致 EF 表达式访问者溢出堆栈(我怀疑一个很大的 IN 子句)。
-
哇。感谢您的回答。这些可能无法在单元测试中捕获,我敢打赌 try/catch 不会捕获它们。
-
won't load the symbols for our application DLLsDebug -> Windows -> Modules 窗口,看看为什么找不到您的 pdb。(右键单击您的 dll 并选择“符号加载信息”)我认为您做得很好(MSFT 符号将被缓存并更快地加载第一次之后)
标签: c# windbg crash-dumps stack-overflow postmortem-debugging