winDbg 命令使用幫助
srv*C:/symbol*http://msdl.microsoft.com/download/symbols;D:\Desktop\CMS_Dump
symck //檢查pdb
lm //顯示pdb
//寫入日志文件
.logopen d:\output.txt
.logclose
.logfile
!heap -s //顯示堆信息
!heap -a 019e0000 //查看泄漏的堆信息
!heap -flt s size //打印所有內存變量(有用)
!address 打印內存信息(有用)
Largest free region(最大可分配的內存塊空間)
------------- windbg 中對其動態調試 示例 --------------------
一. 查看初始的堆狀態
!heap -s
二. 統計一下這個堆里的內存分配情況,發現 1000 字節的內存分配占了 86.97%,目標就鎖定它了。
!heap -stat -h 00230000
size #blocks total ( %) (percent of total busy bytes)
1000 158 - 158000 (86.97)
三. 看一下都是哪些堆申請的
!heap -flt s 1000
四. 挑幾個地址看一下調用棧
!heap -p -a 0303aec0
address 0303aec0 found in
_HEAP @ 230000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
0303aec0 0221 0000 [00] 0303aed8 01000 - (busy)
7707dd6c ntdll!RtlAllocateHeap+0x00000274
7541f947 KERNELBASE!FindNextFileW+0x00000090
...
...
771a3c45 kernel32!BaseThreadInitThunk+0x0000000e
770637f5 ntdll!__RtlUserThreadStart+0x00000070
770637c8 ntdll!_RtlUserThreadStart+0x0000001b
---------------------------------------
dt -s 4c -n DMS_Server!* //查找4c長度的結構體等
dt -v DMS_Server!DataRow 376c4b58+8 //release頭 +8
~*k 查看所有線程的堆棧
//在vs中查看
*(DataRow*)(0x18302b88)
0:004> !address 0x0E41F420
0e419000 : 0e419000 - 00007000
Type 00020000 MEM_PRIVATE
Protect 00000004 PAGE_READWRITE
State 00001000 MEM_COMMIT
Usage RegionUsageStack 棧
Pid.Tid 554.b74
0:004> !address 003f0000
003f0000 : 003f0000 - 00010000
Type 00020000 MEM_PRIVATE
Protect 00000004 PAGE_READWRITE
State 00001000 MEM_COMMIT
Usage RegionUsageHeap 堆
Handle 003f0000