使用WinDbg和wpr调试OutOfMemory异常为什么这些符号显示为?!? -伪装的.net?

问题描述

我一直试图理解为什么在Citrix-Windows 10下获得OOM的原因,尽管在“普通”计算机上却没有发生。 我们的应用程序包含本机C ++,C#和Web浏览器插件。容器是.net。

详细信息: Windows 10版本18363 MP(2 procs)免费x86兼容 产品:WinNt,套件:SingleUserTS 18362.1.wow64fre.19h1_release.190318-1202

2920000 730d0000   clr        (pdb symbols)          
    Loaded symbol image file: clr.dll
    Image path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
    Image name: clr.dll
    browse all global symbols  functions  data
    Timestamp:        Wed Aug  5 03:06:56 2020 (5F2A0630)
    CheckSum:         007B81A2
    ImageSize:        007B0000
    File version:     4.8.4250.0
    Product version:  4.0.30319.0
    File flags:       8 (Mask 3F) Private
    File OS:          4 UnkNown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    information from resource tables:
        CompanyName:      Microsoft Corporation
        ProductName:      Microsoft® .NET Framework
        InternalName:     clr.dll
        OriginalFilename: clr.dll
        ProductVersion:   4.8.4250.0
        FiLeversion:      4.8.4250.0 built by: NET48REL1LAST_C
        PrivateBuild:     DDBLD342B
        FileDescription:  Microsoft .NET Runtime Common Language Runtime - WorkStation
        Legalcopyright:   © Microsoft Corporation.  All rights reserved.
        Comments:         Flavor=Retail

WinDbg上的异常

FAULTING_THREAD:  ffffffff

STACK_TEXT:  
011dd108 6e06611c PresentationCore_ni!System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap+0x47c


STACK_COMMAND:  !D:\WindDbg\windbg\x86\sym\SOS_x86_x86_4.8.4250.00.dll\5F2A06307b0000\SOS_x86_x86_4.8.4250.00.dll.pe 0x26b56e80 ; ** Pseudo Context ** ManagedPseudo ** Value: 12630c10 ** ; kb

MODULE_NAME: UnkNown_Module

IMAGE_NAME:  UnkNown_Image

FAILURE_BUCKET_ID:  CLR_EXCEPTION_System.OutOfMemoryException_8007000e_nexus.framework.healthcare.exe!unkNown_error_in_process

OS_VERSION:  10.0.18362.1

BUILDLAB_STR:  19h1_release

OSPLATFORM_TYPE:  x86

OSNAME:  Windows 10

FAILURE_ID_HASH:  {196470ae-a638-36df-be48-e73b2df228f8}
 *** Followup info cannot be found !!! Please contact...

.OM在.Net上出现,有时该应用程序继续运行! 有时我在taskmanager上使用约700MB的内存时就已经收到了异常,这确实很奇怪。

在获得异常之后,我设法运行PerfView并强制执行GC,在taskmanager上将其从750MB减小到350MB。 不知何故,我感觉GC在Citrix下无法正常工作。

与开始相比,PerfView实际上显示了非常少的对象。

PerfView Diff

Vmap还在堆上显示了许多〜75MB的块-我想这是来自.Net,但是'?!?'打扰我。 我的猜测基于以下事实:我已在PerfView上强制使用GC,而这些块已消失。此外,我在WPA中看到的WPF块的大小与此?!?相同。块。这不是巧合。

Vmap

堆上几乎没有碎片:

Heap Frag

我什至尝试使用wpr找出导致错误的原因,并且我可以看到.net上的WPF正在分配〜75MB的块,这很奇怪?以及-我想这是固定代码。 我几乎可以使用所有符号,但还是没有运气-1吗?呆在那里。 也许wpr没有保存.Net信息-我将需要尝试使用配置文件,但我一直无法访问计算机。

这是WPA视图:

WPF

Blocks

Strange blocks

Wpr

这是Windbg告诉我的有关内存的信息:

WinDbg

如您所见,.net仅使用约147MB的空间,其余200MB我不确定。 VirtualAlloc?我以为他们会加入堆部分。

预留的200MB也是一个很大的问题,我将尝试找出其中的原因。

dll不能减少-我们都需要它们,特别是如果用户一次打开许多插件的话。

我想知道这是否是Citrix问题。 尽管还有175 MB的可用空间,但我还有其他方法可以检查为什么得到此OOM的原因吗?我不认为为什么我们的应用程序一次需要的更多。我们没有显示图片或视频。

我已经检查了GDI / Handles / User对象,一切似乎还可以。他们不高。

我有一个想法但尚未尝试过,就是将GC设置更改为“ Workstation-Concurrent”,以查看会发生什么。不确定这是否有帮助。

这是堆栈:

0:000> k
 # ChildEBP RetAddr  
00 011dbd40 75def159 ntdll!NtWaitForSingleObject+0xc
01 011dbdb4 725e3370 KERNELBASE!WaitForSingleObjectEx+0x99
02 011dbde4 725e33cc clr!CLREventWaitHelper2+0x33
03 011dbe34 725e3319 clr!CLREventWaitHelper+0x2a
04 011dbe6c 725e333b clr!CLREventBase::WaitEx+0x14b
05 011dbe84 728d0125 clr!CLREventBase::Wait+0x1a
06 011dbef0 728d023a clr!Thread::WaitSuspendEventsHelper+0x8a
07 011dbf04 728ce36a clr!Thread::WaitSuspendEvents+0x14
08 011dbf1c 7267bcae clr!Thread::RareEnablePreemptiveGC+0x98
09 011dbf60 72b33ac5 clr!Thread::RaredisablePreemptiveGC+0x115
0a 011dbf84 72b2b333 clr!GCHolderEEInterface<0,1,1>::~GCHolderEEInterface<0,1>+0x61
0b 011dbfb8 72b2b4ea clr!Debugger::SendExceptionHelperAndBlock+0x133
0c 011dc030 72b2b86c clr!Debugger::SendExceptionEventsWorker+0x130
0d 011dc080 72b2b9d9 clr!Debugger::SendException+0x120
0e 011dc0a8 728841fa clr!Debugger::FirstChanceManagedException+0x19
0f 011dc0c4 726c15f4 clr!EetoDebuggerExceptionInterfaceWrapper::FirstChanceManagedException+0x31
10 011dc140 725e0754 clr!COMPlusThrowCallback+0x311
11 011dc40c 725e085a clr!Thread::StackWalkFramesEx+0x92
12 011dc740 726c1f01 clr!Thread::StackWalkFrames+0x9d
13 011dc8f0 726c238f clr!CPFH_RealFirstPassHandler+0x68e
14 011dc940 726c245a clr!CPFH_FirstPassHandler+0x119
15 011dc96c 72885fc7 clr!COMPlusFrameHandler+0x15d
16 011dc98c 770a8e72 clr!COMPlusFrameHandlerRevCom+0x17
17 011dc9b0 770a8e44 ntdll!ExecuteHandler2+0x26
18 011dca78 770942d6 ntdll!ExecuteHandler+0x24
19 011dca78 75e044c2 ntdll!KiUserExceptiondispatcher+0x26
1a 011dcf9c 726c28f0 KERNELBASE!RaiseException+0x62
1b 011dd038 726c3796 clr!RaiseTheExceptionInternalOnly+0x230
1c 011dd100 6e06611c clr!IL_Throw+0x146
WARNING: Stack unwind information not available. Following frames may be wrong.
1d 011dd1f0 6e04ff49 PresentationCore_ni+0x26611c
1e 011dd230 6e04feb2 PresentationCore_ni+0x24ff49
1f 011dd23c 6e04fe89 PresentationCore_ni+0x24feb2
20 011dd24c 6e04e3f0 PresentationCore_ni+0x24fe89
21 011dd390 6e04d910 PresentationCore_ni+0x24e3f0
22 011dd3cc 153582a3 PresentationCore_ni+0x24d910
23 011dd3dc 24be9b87 0x153582a3
24 011dd408 24be9a4d 0x24be9b87
25 011dd440 24be9986 0x24be9a4d
26 011dd458 24be96dd 0x24be9986
27 011dd470 1defd0c2 0x24be96dd
28 011dd4c4 1defcdb8 0x1defd0c2
29 011dd4d0 05de45c1 0x1defcdb8
2a 011dd51c 13ac31bb 0x5de45c1
2b 011dd52c 05de1fd8 0x13ac31bb
2c 011dd554 05de1e38 0x5de1fd8
2d 011dd56c 14a46136 0x5de1e38
2e 011dd588 14a46007 0x14a46136
2f 011dd5c0 725cf404 0x14a46007
30 011dd5e8 72694073 clr!COMToCLRdispatchHelper+0x6b
31 011dd644 0164e631 clr!COMToCLRWorker+0x4d5
32 011dd670 5b03e711 0x164e631
33 011dd6b0 5b03eeec NXIMFServer+0x7e711
34 011dd6f8 5afc480b NXIMFServer+0x7eeec
35 011dd79c 5b03aee0 NXIMFServer+0x480b
36 011dd82c 5b03ad7c NXIMFServer+0x7aee0
37 011dd8fc 5b03b147 NXIMFServer+0x7ad7c
38 011dd984 5b03cc47 NXIMFServer+0x7b147
39 011dd9bc 5b03afee NXIMFServer+0x7cc47
3a 011dda0c 760b829f NXIMFServer+0x7afee
3b 011dda34 7609a861 oleaut32!dispCallFunc+0x16f
3c 011ddcf8 76093e8d oleaut32!CTypeInfo2::Invoke+0x631
3d 011ddd24 5b013552 oleaut32!dispInvoke+0x2d
3e 011ddd4c 69f8e057 NXIMFServer+0x53552
3f 011dde10 69f8e45e mfc140!COledispatchDriver::InvokeHelperV+0x227 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\oledisp2.cpp @ 399] 
40 011dde30 25558ee1 mfc140!COledispatchDriver::InvokeHelper+0x1e [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\oledisp2.cpp @ 557] 
41 011dde5c 25558e01 MFListManAX!DllUnregisterServer+0x3951
42 011ddeb8 25558a3d MFListManAX!DllUnregisterServer+0x3871
43 011dded0 69fbe19b MFListManAX!DllUnregisterServer+0x34ad
44 011ddfa0 69fbd9cd mfc140!CWnd::OnWndMsg+0x79b [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2698] 
45 011ddfc4 69f2ade3 mfc140!CWnd::WindowProc+0x2d [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2099] 
46 011ddfec 69fbbcd7 mfc140!COleControl::WindowProc+0x133 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\ctlcore.cpp @ 1711] 
47 011de064 69fbbf24 mfc140!AfxCallWndProc+0xb7 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 268] 
48 011de084 2556bf30 mfc140!AfxWndProc+0x34 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 417] 
49 011de0c0 753345cb MFListManAX!DllUnregisterServer+0x169a0
4a 011de0ec 753150dc user32!_InternalCallWinProc+0x2b
4b 011de1d0 7531462f user32!UserCallWinProcCheckWow+0x3ac
4c 011de208 679fe787 user32!CallWindowProcW+0x7f
4d 011de230 725cf36d ToolkitPro1631vc140!CXTPSkinManagerApiHook::OnHookCallWindowProcW+0x77
4e 011de270 079a7957 clr!PInvokeStackImbalanceHelper+0x22
4f 011de2b8 079a787a 0x79a7957
50 011de2fc 14741f41 0x79a787a
51 011de330 079a65a9 0x14741f41
52 011de338 079a6580 0x79a65a9
53 011de34c 079a7a56 0x79a6580
54 011de388 14508f10 0x79a7a56
55 011de3bc 753345cb 0x14508f10
56 011de3e8 753150dc user32!_InternalCallWinProc+0x2b
57 011de4cc 7531488d user32!UserCallWinProcCheckWow+0x3ac
58 011de530 75329f7d user32!SendMessageWorker+0x1fd
59 011de560 2555d0d9 user32!SendMessageA+0x11d
5a 011de58c 28f95acf MFListManAX!DllUnregisterServer+0x7b49
5b 011de788 12c7e319 ML3001_2G!CMFListManagerGridView::OnLButtonDblClkRowCol+0x89f
5c 011de7c8 12c683eb GX6082VC140R!CGXControl::LButtonDblClk+0xb9
5d 011de860 12cda891 GX6082VC140R!CGXGridCore::DoLButtonDblClk+0x6cb
5e 011de878 69fbdf55 GX6082VC140R!CGXGridView::OnLButtonDblClk+0x21
5f 011de94c 69fbd9cd mfc140!CWnd::OnWndMsg+0x555 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2698] 
60 011de970 12cdb074 mfc140!CWnd::WindowProc+0x2d [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 2099] 
61 011de98c 69fbbcd7 GX6082VC140R!CGXGridView::WindowProc+0x44
62 011dea04 69fbbf24 mfc140!AfxCallWndProc+0xb7 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 268] 
63 011dea24 2556bf30 mfc140!AfxWndProc+0x34 [d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wincore.cpp @ 417] 
64 011dea60 753345cb MFListManAX!DllUnregisterServer+0x169a0
65 011dea8c 753150dc user32!_InternalCallWinProc+0x2b
66 011deb70 7531422e user32!UserCallWinProcCheckWow+0x3ac
67 011debe4 75314010 user32!dispatchMessageWorker+0x20e
68 011debf0 725cf36d user32!dispatchMessageW+0x10
69 011dec20 6eb374f1 clr!PInvokeStackImbalanceHelper+0x22
6a 011dec5c 6eb1b3d7 WindowsBase_ni+0xf74f1
6b 011deca4 6eb1b319 WindowsBase_ni+0xdb3d7
6c 011decb0 68782ecc WindowsBase_ni+0xdb319
6d 011decc0 68782a8a PresentationFramework_ni+0x2c2ecc
6e 011dece0 6878287e PresentationFramework_ni+0x2c2a8a
6f 011ded00 14e8e234 PresentationFramework_ni+0x2c287e
70 011ded28 016e0dff 0x14e8e234
71 011ded58 725cf036 0x16e0dff
72 011ded64 725d22da clr!CallDescrWorkerInternal+0x34
73 011dedb8 725d859b clr!CallDescrWorkerWithHandler+0x6b
74 011dee2c 7277b11b clr!MethodDescCallSite::CallTargetWorker+0x16a
75 011def50 7277b7fa clr!RunMain+0x1b3
76 011df1bc 7277b727 clr!Assembly::ExecuteMainMethod+0xf7
77 011df6a0 7277b8a8 clr!SystemDomain::ExecuteMainMethod+0x5ef
78 011df6f8 7277b9ce clr!ExecuteEXE+0x4c
79 011df738 72777305 clr!_CorExeMainInternal+0xdc
7a 011df774 7420fa84 clr!_CorExeMain+0x4d
7b 011df7ac 7477e80e mscoreei!_CorExeMain+0xd6
7c 011df7bc 74784338 mscoree!ShellShim__CorExeMain+0x9e
7d 011df7c4 76d16359 mscoree!_CorExeMain_Exported+0x8
7e 011df7d4 77087c24 kernel32!BaseThreadInitThunk+0x19
7f 011df830 77087bf4 ntdll!__RtlUserThreadStart+0x2f
80 011df840 00000000 ntdll!_RtlUserThreadStart+0x1b

和线程:

0:000> !threads
ThreadCount:      11
UnstartedThread:  0
BackgroundThread: 10
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadobJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 1fc8 0173da08     a6028 Preemptive  26B56FB0:00000000 01736698 1     STA System.OutOfMemoryException 26b56e80
   3    2 2c84 01782be0     2b228 Preemptive  00000000:00000000 01736698 0     MTA (Finalizer) 
   6    3 279c 06031fc8   102a228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Worker) 
   9    6 2404 0801d028   202b228 Preemptive  00000000:00000000 01736698 1     MTA 
  28   10 2298 21eddb10   a029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Completion Port) 
  33    8 29d0 0608bde0   1029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Worker) 
  34    7 2d08 2c5f1f10   1029228 Preemptive  26B51A60:00000000 01736698 0     MTA (Threadpool Worker) 
  35    4 1db0 21eb39c8   1029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Worker) 
  36   11 2550 2bc2d008     a1228 Preemptive  00000000:00000000 01736698 0     Ukn 
  38    5  2a0 0d7d2090   8029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Completion Port) 
  39    9 2010 2c502b50   8029228 Preemptive  00000000:00000000 01736698 0     MTA (Threadpool Completion Port) 

********编辑********** 因此,我已经搜索了位图:

Statistics:
      MT    Count    TotalSize Class Name
6de2a780        1           12 System.Windows.Media.Imaging.BitmapCreateOptions
6de1144c        1           20 System.Windows.UncommonField`1[[System.Windows.Media.BitmapScalingMode,PresentationCore]]
6e796fdc        2           32 System.Windows.Media.Effects.BitmapEffectState
6de11368        2           40 System.Windows.UncommonField`1[[System.Windows.Media.Effects.BitmapEffectState,PresentationCore]]
6de20d8c        2           72 System.Windows.Media.Effects.DropShadowBitmapEffect
6de0e698        6           72 System.Windows.Media.BitmapScalingMode
6de2a748        7           84 System.Windows.Media.Imaging.BitmapCacheOption
6e7968f8        1          108 System.Windows.Media.Imaging.IconBitmapDecoder
6de202d8       15          300 System.Windows.Media.Imaging.BitmapPalette
6de2d9a4       19          304 System.Windows.Media.Imaging.BitmapSource+WeakBitmapSourceEventSink
6de217d4        4          432 System.Windows.Media.Imaging.JpegBitmapDecoder
6de20650        4          720 System.Windows.Media.Imaging.ColorConvertedBitmap
6de2d0e4       55          880 System.Collections.ObjectModel.ReadOnlyCollection`1[[System.Windows.Media.Imaging.BitmapFrame,PresentationCore]]
6de2d374       55          900 System.Windows.Media.Imaging.BitmapFrame[]
6de2d15c       55         1320 System.Collections.Generic.List`1[[System.Windows.Media.Imaging.BitmapFrame,PresentationCore]]
6de20434        9         1368 System.Windows.Media.Imaging.CachedBitmap
6de0a224       10         1400 System.Windows.Media.Imaging.UnmanagedBitmapWrapper
6de2cb5c      300         3600 System.Windows.Media.Imaging.BitmapInitialize
6de2200c       50         5400 System.Windows.Media.Imaging.PngBitmapDecoder
6de2d3e8      280         6720 System.Windows.Media.Imaging.BitmapSourceSafeMILHandle
6de2d22c       98        17640 System.Windows.Media.Imaging.BitmapFrameDecode
6de2a134      179        37232 System.Windows.Media.Imaging.BitmapImage
Total 1155 objects

我获得OOM的地方不一定是造成高内存使用的地方,但无论如何:

0:000> !pe
Exception object: 26b56e80
Exception type:   System.OutOfMemoryException
Message:          Nicht genügend Speicher verfügbar,um das Programm weiter auszuführen.
InnerException:   <none>
StackTrace (generated):
    SP       IP       Function
    011DD108 6E06611C PresentationCore_ni!System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap(System.Windows.Media.Imaging.BitmapFrame,System.Windows.Media.Imaging.BitmapSourceSafeMILHandle,System.Windows.Media.Imaging.BitmapCreateOptions,System.Windows.Media.Imaging.BitmapCacheOption,System.Windows.Media.Imaging.BitmapPalette)+0x47c

StackTraceString: <none>
HResult: 8007000e
0:000> .exr -1
*** WARNING: Unable to verify checksum for PresentationCore.ni.dll
ExceptionAddress: 6e06611c (PresentationCore_ni+0x0026611c)
   ExceptionCode: e0434f4d (CLR exception)
  ExceptionFlags: 00000000
NumberParameters: 0
0:000> !clrstack
OS Thread Id: 0x1fc8 (0)
Child SP       IP Call Site
011dd058 77091e4c [HelperMethodFrame: 011dd058] 
011dd108 6e06611c System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap(System.Windows.Media.Imaging.BitmapFrame,System.Windows.Media.Imaging.BitmapPalette)
011dd204 6e04ff49 System.Windows.Media.Imaging.CachedBitmap.FinalizeCreation()
011dd238 6e04feb2 System.Windows.Media.Imaging.CachedBitmap.EndInit()
011dd244 6e04fe89 System.Windows.Media.Imaging.CachedBitmap..ctor(System.Windows.Media.Imaging.BitmapSource,System.Windows.Media.Imaging.BitmapCacheOption)
011dd25c 6e04e3f0 System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
011dd398 6e04d910 System.Windows.Media.Imaging.BitmapImage.EndInit()

谢谢, 马可

解决方法

.OM出现在.Net上,有时应用程序仍可继续工作

只有在以下情况下才会如此

  • 捕获并处理了异常
  • 它发生在UI线程上,并且.NET显示一个对话框,无论您是否要继续

其他时候,我在使用约700MB内存时已经收到了例外情况

a)您可以在任何内存使用情况下获得OOM异常。 “已”不是此OOM的科学方法。 b)什么是“内存使用率”?您是否谈论虚拟内存,.NET内存,本机内存,工作集大小,峰值工作集大小?请熟悉这些术语并使用正确的术语。理想情况下,还要命名用于测量的工具。

得到异常后,我设法运行PerfView并强制执行GC,将其从> 750MB减小到350MB。不知何故,我感觉GC在Citrix下无法正常工作。

.NET可能会在需要时决定进行垃圾回收。有时,它更喜欢运行计算而不是垃圾回收。您可以强制进行垃圾回收并且减少内存,这一事实向我表明GC基本可以正常工作。

与开始相比,PerfView实际上显示了很少的对象。

一个对象足以解决内存泄漏。

Vmap还在堆上显示了许多〜75MB的块-我想这是来自.Net

是什么让您猜测这些来自.NET? .NET不使用堆管理器。它使用虚拟内存管理器。因此,这些块可能不是.NET中的不是

堆上几乎没有碎片

内存碎片可能是一个问题。但是为什么要关心本地堆内部的碎片化?

这奇怪吗?!?以及-我想这是代码错误

是的,很可能。

我几乎可以使用所有符号,但还是没有运气-1吗?呆在那里。

仅用于调试.NET的符号还不够,大多数应用程序都无法使用.NET。对于.NET,应用程序需要能够处理有关.NET工作原理的详细信息。对于WinDbg,该逻辑编码在WinDbg SOS扩展中。 MSCORDACWKS.DLL中提供了内存管理详细信息

只要应用程序不要求您提供这些,它就可能不支持.NET。

尽管还有175 MB的可用空间,我还能做些什么检查为什么得到此OOM?

如果您的应用程序要一次分配176 MB的内存,则175 MB将不够。在崩溃时检查您的应用程序需要多少内存。

这是堆栈

为什么在这里使用本机堆栈命令,但使用托管线程命令?

问题

在整篇文章中,我都错过了托管和本地内容之间的区别。您正在将堆栈的k之类的本地命令与!threads之类的托管命令混合在一起。您正在使用本机命令!analyze而不是托管命令!pe分析.NET异常。您正在研究托管的OOM异常,但同时您也看到了本机堆的碎片。

如何调试

训练一下内存如何协同工作。 .NET内存将成为<unknown>列出的!address -summary内存的一部分。但是,其他一些库也将使用虚拟内存管理器,因此也被列为<unknown>。位图是一个常见的例子。

要分析.NET内存,您需要使用来自SOS扩展名的.NET特定命令。使用!dumpheap -stat!eeheap -gc。帮我们一个忙,不要将输出发布为图像。使用.logopen获取文本输出。

要更好地比较.NET内存,请使用擅长于此的工具。 WinDbg不是。诸如JetBains dotMemory之类的工具都适合于此。在这种比较中,过滤掉您知道需要处置的对象。

WinDbg列出为堆的是本机堆。这些通常来自C ++库。

仅因为您看到.NET OOM异常并不意味着.NET引起了它。您还可以查看内存的其他部分以避免OOM:

  • 本地堆仍然是应用程序中最大的内存部分。为什么?您可能会在内存分配上设置断点,并检查谁分配了75 MB的块。
  • 为什么要加载400 MB的DLL?你能摆脱一些吗?
  • 为什么有200 MB的保留内存?谁分配的?出于什么原因?