【问题标题】:How to use WinDBG to track down .net out of memory exceptions?如何使用 WinDBG 追踪 .net 内存不足异常?
【发布时间】:2014-11-26 08:48:24
【问题描述】:

我需要在 .NET 应用程序中找出内存不足 (OOM) 异常的原因。使用 perfmon,应用程序在使用相对较低的内存 (500-700mb) 时会崩溃并出现 OOM,因此我假设存在某种堆碎片。

经过研究,WinDBG 似乎是用来追踪此类问题的工具。我已经在运行进程的服务器上设置了 DebugDiag。我还设法将 DebugDiag 中的转储加载到 WinDBG 中,连接符号服务器和我自己的私有符号文件,这一切似乎都有效 - 我可以运行像 !clrstack!dumpheap -stat 这样的命令,我会看到我的列出的类名。

我现在遇到的问题是我不知道如何解决追踪碎片在哪里的问题。 WinDGB 有很多带有很多不同标志和选项的命令,我不确定应该使用哪些。我也找不到一个很好的教程来说明该做什么 - 大多数都是关于启动和运行 WinDBG 的基础知识。

有人能指出我正确的方向吗?

【问题讨论】:

标签: .net windbg


【解决方案1】:

这是我用来决定 .NET OutOfMemoryExceptions 的图表:

对于!u 部分,到目前为止我知道两个选项。首先是创建大量对象。有关详细信息,请参阅How to identify array type。第二个是直接抛出 OutOfMemoryException,你可以这样识别:

0:000> .symfix d:\debug\symbols

0:000> .reload

0:000> ~#s

0:000> .loadby sos mscorwks; *** Use clr if .NET4

0:000> !pe
Exception object: 025d07d8
Exception type: System.OutOfMemoryException
Message: Nicht genügend Speicher verfügbar, um das Programm weiter auszuführen.
InnerException: <none>
StackTrace (generated):
    SP       IP       Function
    0024EC90 004F008D OOM1!OOM1.Program.Main()+0x1d

0:000> !u 004F008D 
Normal JIT generated code
OOM1.Program.Main()
Begin 004f0070, size 1e
004f0070 50              push    eax
004f0071 b96c0fcb78      mov     ecx,offset mscorlib_ni+0x270f6c (78cb0f6c) (MT: System.OutOfMemoryException)
004f0076 e8a11ff1ff      call    0040201c (JitHelp: CORINFO_HELP_NEWSFAST)
004f007b 890424          mov     dword ptr [esp],eax
004f007e 8bc8            mov     ecx,eax
004f0080 e8f314c078      call    mscorlib_ni+0x6b1578 (790f1578) (System.OutOfMemoryException..ctor(), mdToken: 0600036a)
004f0085 8b0c24          mov     ecx,dword ptr [esp]
004f0088 e84a615179      call    mscorwks!JIT_Throw (79a061d7)
>>> 004f008d cc              int     3

在 C# 中对 call System.OutOfMemoryException..ctor() 的调用是 new OutOfMemoryException()call mscorwks!JIT_Throwthrow 关键字。

【讨论】:

  • 太棒了!喜欢流程图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多