查找谁申请了这块内存

我们有时候得某块内存地址,但不知道他是谁申请的。

通过AppVerifier,我们可以得到stack trace。


1. 设置Normal page heap。

2. 在windbg里运行程序。

3. 得到某个内存地址

4. 查找Heap Block

0:000> !heap -x 01b4b4a0
Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
-----------------------------------------------------------------------------
01b4b478  01b4b480  01b40000  01b40640        40       160        16  busy extra

5. User address是我们所感兴趣的。

0:000> dt _DPH_BLOCK_INFORMATION 01b4b480 
ntdll!_DPH_BLOCK_INFORMATION
   +0x000 StartStamp       : 0xabcdaaaa
   +0x004 Heap             : 0x81a41000
   +0x008 RequestedSize    : 2
   +0x00c ActualSize       : 0x2a
   +0x010 FreeQueue        : _LIST_ENTRY [ 0x27 - 0x0 ]
   +0x010 TraceIndex       : 0x27
   +0x018 StackTrace       : 0x00357288
   +0x01c EndStamp         : 0xdcbaaaaa
6. 验证是否正确。RequestedSize == 2。

7. 我们所感兴趣的是offset在0x18处的Stack Trace.

8. 运行dds,得到strack trace

0:000> dds 0x00357288
00357288  abcdaaaa
0035728c  00000001
00357290  00000007
00357294  00000001
00357298  00000002
0035729c  01a41000
003572a0  00000000
003572a4  003572a8
003572a8  7c94b394 ntdll!RtlAllocateHeapSlowly+0x44
003572ac  7c918f21 ntdll!RtlAllocateHeap+0xe64
003572b0  0037fd2c vfbasics!AVrfpRtlAllocateHeap+0xb1
003572b4  78583db8 MSVCR90!malloc+0x79 [f:\dd\vctools\crt_bld\self_x86\crt\src\malloc.c @ 163]
003572b8  78583eb8 MSVCR90!operator new+0x1f [f:\dd\vctools\crt_bld\self_x86\crt\src\new.cpp @ 59]
003572bc  00401007 HeapAllocation!wmain+0x7 [d:\codebase\cpp_demos\heapallocation\heapallocation.cpp @ 17]
003572c0  7c817067 kernel32!BaseProcessStart+0x23

原文地址:https://www.cnblogs.com/xiaxi/p/1947115.html