如何使用WinDBG跟踪.net内存异常?

use*_*836 5 .net windbg

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

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

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

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

Tho*_*ler 16

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

.NET内存不足决策树

对于!u部分,我知道两个选项为止.第一个是创建大量对象.有关详细信息,请参见如何识别阵列类型 第二个是直接抛出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
Run Code Online (Sandbox Code Playgroud)

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

  • 太棒了!喜欢流程图 (3认同)