gpt4 book ai didi

debugging - 如何分析windbg中的内存使用情况

转载 作者:IT王子 更新时间:2023-10-28 23:29:26 26 4
gpt4 key购买 nike

这是一个在 x64 机器上运行的 .NET v4 Windows 服务应用程序。在稳定运行几天后的某个时候,Windows 服务的内存消耗会像疯了一样猛增,直到它崩溃。我能够以 1.2 GB 捕获它并捕获内存转储。这是我得到的

如果我在我的转储文件上运行 !address -summary in windbg,我会得到以下结果

!地址-摘要

--- Usage Summary ------ RgnCount ------- Total Size -------- %ofBusy  %ofTotal
Free 821 7ff`7e834000 ( 7.998 Tb) 99.98%
<unclassified> 3696 0`6eece000 ( 1.733 Gb) 85.67% 0.02%
Image 1851 0`0ea6f000 ( 234.434 Mb) 11.32% 0.00%
Stack 1881 0`03968000 ( 57.406 Mb) 2.77% 0.00%
TEB 628 0`004e8000 ( 4.906 Mb) 0.24% 0.00%
NlsTables 1 0`00023000 ( 140.000 kb) 0.01% 0.00%
ActivationContextData 3 0`00006000 ( 24.000 kb) 0.00% 0.00%
CsrSharedMemory 1 0`00005000 ( 20.000 kb) 0.00% 0.00%
PEB 1 0`00001000 ( 4.000 kb) 0.00% 0.00%
-
-
-
--- Type Summary (for busy) -- RgnCount ----- Total Size ----- %ofBusy %ofTotal
MEM_PRIVATE 5837 0`7115a000 ( 1.767 Gb) 87.34% 0.02%
MEM_IMAGE 2185 0`0f131000 (241.191 Mb) 11.64% 0.00%
MEM_MAPPED 40 0`01531000 ( 21.191 Mb) 1.02% 0.00%
-
-
--- State Summary ------------ RgnCount ------ Total Size ---- %ofBusy %ofTotal
MEM_FREE 821 7ff`7e834000 ( 7.998 Tb) 99.98%
MEM_COMMIT 6127 0`4fd5e000 ( 1.247 Gb) 61.66% 0.02%
MEM_RESERVE 1935 0`31a5e000 (794.367 Mb) 38.34% 0.01%
-
-
--Protect Summary(for commit)- RgnCount ------ Total Size --- %ofBusy %ofTotal
PAGE_READWRITE 3412 0`3e862000 (1000.383 Mb) 48.29% 0.01%
PAGE_EXECUTE_READ 220 0`0b12f000 ( 177.184 Mb) 8.55% 0.00%
PAGE_READONLY 646 0`02fd0000 ( 47.813 Mb) 2.31% 0.00%
PAGE_WRITECOPY 410 0`01781000 ( 23.504 Mb) 1.13% 0.00%
PAGE_READWRITE|PAGE_GUARD 1224 0`012f2000 ( 18.945 Mb) 0.91% 0.00%
PAGE_EXECUTE_READWRITE 144 0`007b9000 ( 7.723 Mb) 0.37% 0.00%
PAGE_EXECUTE_WRITECOPY 70 0`001cd000 ( 1.801 Mb) 0.09% 0.00%
PAGE_EXECUTE 1 0`00004000 ( 16.000 kb) 0.00% 0.00%
-
-
--- Largest Region by Usage ----Base Address -------- Region Size ----------
Free 0`8fff0000 7fe`59050000 ( 7.994 Tb)
<unclassified> 0`80d92000 0`0f25e000 ( 242.367 Mb)
Image fe`f6255000 0`0125a000 ( 18.352 Mb)
Stack 0`014d0000 0`000fc000 (1008.000 kb)
TEB 0`7ffde000 0`00002000 ( 8.000 kb)
NlsTables 7ff`fffb0000 0`00023000 ( 140.000 kb)
ActivationContextData 0`00030000 0`00004000 ( 16.000 kb)
CsrSharedMemory 0`7efe0000 0`00005000 ( 20.000 kb)
PEB 7ff`fffdd000 0`00001000 ( 4.000 kb)

首先,为什么未分类的文件一次显示为 1.73 GB,另一次显示为 242 MB。 (已回答。谢谢)

其次,我知道未分类可能意味着托管代码,但是根据 !eeheap 我的堆大小仅为 248 MB,实际上与 242 匹配,但甚至不接近 1.73GB。转储文件大小为 1.2 GB,远高于正常值。我从哪里去找出所有内存的使用情况。托管堆世界中的任何内容都低于 248 MB,但我使用的是 1.2 GB。

谢谢

编辑

如果我执行 !heap -s 我会得到以下结果

LFH Key                   : 0x000000171fab7f20
Termination on corruption : ENABLED
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
-------------------------------------------------------------------------------------
Virtual block: 00000000017e0000 - 00000000017e0000 (size 0000000000000000)
Virtual block: 0000000045bd0000 - 0000000045bd0000 (size 0000000000000000)
Virtual block: 000000006fff0000 - 000000006fff0000 (size 0000000000000000)
0000000000060000 00000002 113024 102028 113024 27343 1542 11 3 1c LFH
External fragmentation 26 % (1542 free blocks)
0000000000010000 00008000 64 4 64 1 1 1 0 0
0000000000480000 00001002 3136 1380 3136 20 8 3 0 0 LFH
0000000000640000 00041002 512 8 512 3 1 1 0 0
0000000000800000 00001002 3136 1412 3136 15 7 3 0 0 LFH
00000000009d0000 00001002 3136 1380 3136 19 7 3 0 0 LFH
00000000008a0000 00041002 512 16 512 3 1 1 0 0
0000000000630000 00001002 7232 3628 7232 18 53 4 0 0 LFH
0000000000da0000 00041002 1536 856 1536 1 1 2 0 0 LFH
0000000000ef0000 00041002 1536 944 1536 4 12 2 0 0 LFH
00000000034b0000 00001002 1536 1452 1536 6 17 2 0 0 LFH
00000000019c0000 00001002 3136 1396 3136 16 6 3 0 0 LFH
0000000003be0000 00001002 1536 1072 1536 5 7 2 0 3 LFH
0000000003dc0000 00011002 512 220 512 100 60 1 0 2
0000000002520000 00001002 512 8 512 3 2 1 0 0
0000000003b60000 00001002 339712 168996 339712 151494 976 116 0 18 LFH
External fragmentation 89 % (976 free blocks)
Virtual address fragmentation 50 % (116 uncommited ranges)
0000000003f20000 00001002 64 8 64 3 1 1 0 0
0000000003d90000 00001002 64 8 64 3 1 1 0 0
0000000003ee0000 00001002 64 16 64 11 1 1 0 0
-------------------------------------------------------------------------------------

最佳答案

我最近遇到了一个非常相似的情况,并发现了一些对调查有用的技术。没有一个是 Elixir ,但每一个都更能说明问题。

1) 来自 SysInternals (http://technet.microsoft.com/en-us/sysinternals/dd535533) 的 vmmap.exe 很好地关联了 native 和托管内存的信息,并在一个漂亮的 UI 中呈现了它。可以使用以下技术收集相同的信息,但这更容易,也是一个不错的起点。遗憾的是,它不适用于转储文件,您需要一个实时进程。

2) “!address -summary”输出是更详细的“!address”输出的汇总。我发现将详细输出放入 Excel 并运行一些数据透视表很有用。使用这种技术,我发现被列为“”的大量字节实际上是 MEM_IMAGE 页面,可能是在加载 DLL 时加载的数据页面的副本,然后在数据更改时复制。我还可以过滤到大区域并深入研究特定地址。用牙签在内存转储中四处寻找并进行大量祈祷是很痛苦的,但也可以揭示。

3) 最后,我做了一个穷人版的 vmmap.exe 技术。我加载了转储文件,打开了一个日志,然后运行了!address、!eeheap、!heap 和!threads。我还使用 !teb 定位了 ~*k 中列出的线程环境 block 。我关闭了日志文件并将其加载到我最喜欢的编辑器中。然后我可以找到一个未分类的 block 并搜索以查看它是否从更详细的命令之一的输出中弹出。您可以很快将本地堆和托管堆关联起来,以将那些从可疑的未分类区域中剔除。

这些都太手动了。我很想编写一个脚本,其输出类似于我在上面的技术 3 中生成的输出,并输出一个适合查看 vmmap.exe 的 mmp 文件。总有一天。

最后一点:我在 vmmap.exe 的输出与 !address 输出之间进行了关联,并注意到 vmmap 对从各种来源识别的这些类型的区域(类似于 !heap 和 !eeheap 使用的区域)但是 !address 没有不知道。也就是说,这些是 vmmap.exe 标记但 !address 没有标记的内容:

.data
.pdata
.rdata
.text
64-bit thread stack
Domain 1
Domain 1 High Frequency Heap
Domain 1 JIT Code Heap
Domain 1 Low Frequency Heap
Domain 1 Virtual Call Stub
Domain 1 Virtual Call Stub Lookup Heap
Domain 1 Virtual Call Stub Resolve Heap
GC
Large Object Heap
Native heaps
Thread Environment Blocks

仍然有很多“私有(private)”字节下落不明,但同样,如果我能清除这些问题,我就能缩小问题的范围。

希望这能给您一些关于如何调查的想法。我在同一条船上,所以我也会很感激你的发现。谢谢!

关于debugging - 如何分析windbg中的<unclassified>内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9023669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com