Windbg堆内存

一般要查内存泄露在没有verify的情况下比较困难,特别是分析dmp无法调试的时候;

直接略过堆和断的概念简单看看是哪个内存块重复分配很多次吧。

测试代码如下

int main()
{

	char* pp = nullptr;
	while (1)
	{
		Sleep(1000);
		pp = new char[10000];
	}



	return 0;

}

一、内存泄露都是在堆上分配的内存,不管是malloc、realloc还是new,或者直接HeapAlloc都是专用内存。先查看堆信息

0:000> !heap
Failed to read heap keySEGMENT HEAP ERROR: failed to initialize the extention
Index   Address  Name      Debugging options enabled
  1:   004c0000                 tail checking free checking validate parameters
  2:   00020000                 tail checking free checking validate parameters
  3:   00c00000                 tail checking free checking validate parameters


004c0000主进程一般都是采用进程默认堆作为crt堆,无论mt还是md,但加载其他dll就不一定了。

二、找一下是哪个块在增长的比较多,占用比较大。

以下0x2710这个内存分配了5次,占用26.68%

0:000> !heap -stat -h 00000000004c0000 
 heap @ 00000000004c0000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    2710 5 - c350  (26.68)
    100 42 - 4200  (9.02)
    120 2e - 33c0  (7.07)
    1000 3 - 3000  (6.56)
    210 10 - 2100  (4.51)
    13d4 1 - 13d4  (2.71)
    1200 1 - 1200  (2.46)
    800 2 - 1000  (2.19)
    400 4 - 1000  (2.19)
    50 33 - ff0  (2.18)
    790 2 - f20  (2.07)
    20 73 - e60  (1.96)
    390 4 - e40  (1.95)
    168 a - e10  (1.92)
    df0 1 - df0  (1.90)
    38 32 - af0  (1.49)
    40 2a - a80  (1.43)
    9d8 1 - 9d8  (1.34)
    200 4 - 800  (1.09)
    760 1 - 760  (1.01)

三、到这里可以结合代码或者调试手段定位问题了,进一步通过 !heap -a xxxxxx对比前后两次结果可以具体定位分配的内存块。

前后两次查看堆详细信息的对比

Windbg堆内存_第1张图片

最后多了一块内存块

 0000000000596c10: 02740 . 02740 [107] - busy (2710), tail fill

 而申请的内存块地址为:

0:000> dv
             pp = 0x00000000`00596c20 ".???"

 因为没有开verify,不能追踪栈回溯,只能结合代码或者调试下断点看了。

你可能感兴趣的:(heap)