本机内存泄漏 – 如何find分配源的调用堆栈

基于!address -summary命令的以下输出,我认为我有一个本机内存泄漏。 为了抑制这些分配正在发生的地方,我在下面的文章http://www.codeproject.com/KB/cpp/MemoryLeak.aspx

0:000> !address -summary TEB 7efdd000 in range 7efdb000 7efde000 TEB 7efda000 in range 7efd8000 7efdb000 TEB 7efd7000 in range 7efd5000 7efd8000 TEB 7efaf000 in range 7efad000 7efb0000 TEB 7efac000 in range 7efaa000 7efad000 ProcessParametrs 00441b78 in range 00440000 00540000 Environment 004407f0 in range 00440000 00540000 -------------------- Usage SUMMARY -------------------------- TotSize ( KB) Pct(Tots) Pct(Busy) Usage 551a000 ( 87144) : 04.16% 14.59% : RegionUsageIsVAD 5b8d3000 ( 1499980) : 71.53% 00.00% : RegionUsageFree 2cc3000 ( 45836) : 02.19% 07.68% : RegionUsageImage 4ff000 ( 5116) : 00.24% 00.86% : RegionUsageStack 0 ( 0) : 00.00% 00.00% : RegionUsageTeb 1c040000 ( 459008) : 21.89% 76.87% : RegionUsageHeap 0 ( 0) : 00.00% 00.00% : RegionUsagePageHeap 1000 ( 4) : 00.00% 00.00% : RegionUsagePeb 0 ( 0) : 00.00% 00.00% : RegionUsageProcessParametrs 0 ( 0) : 00.00% 00.00% : RegionUsageEnvironmentBlock Tot: 7fff0000 (2097088 KB) Busy: 2471d000 (597108 KB) 0:000> !heap -s LFH Key : 0x7fdcf95f Termination on corruption : DISABLED Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast (k) (k) (k) (k) length blocks cont. heap ----------------------------------------------------------------------------- 00440000 00000002 453568 436656 453568 62 54 32 0 0 LFH 006b0000 00001002 64 16 64 4 2 1 0 0 002b0000 00041002 256 4 256 2 1 1 0 0 00620000 00001002 64 16 64 5 2 1 0 0 00250000 00001002 64 16 64 4 2 1 0 0 007d0000 00041002 256 4 256 0 1 1 0 0 005c0000 00001002 1088 388 1088 7 17 2 0 0 LFH 02070000 00041002 256 4 256 1 1 1 0 0 02270000 00041002 256 144 256 0 1 1 0 0 LFH 04e10000 00001002 3136 1764 3136 384 36 3 0 0 LFH External fragmentation 21 % (36 free blocks) ----------------------------------------------------------------------------- 

但是当我运行heap -p -a命令时,我没有得到任何调用堆栈,只是以下。 任何想法如何获得分配来源的调用堆栈?

 0:000> !heap -p -a 0218e008 address 0218e008 found in _HEAP @ 4e10000 HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 0218e000 001c 0000 [00] 0218e008 000d4 - (busy) 

如果你没有从!heap -p -a获得一个调用堆栈
原因可能是你没有正确使用gflags
记住使用正确的名称,包括.exe
尝试以inteactivly的方式启动并转到图像选项卡,可能会更容易
尝试页堆,这也给调用堆栈

使用valgrind for linux和deleaker for windows。

你应该使用删除者。 这是调试的强大工具。

我对Windows一无所知,但至少在Unix系统上,调试器(如Linux上的gdb )对理解调用堆栈非常有用。

你也可以通过使用博姆的保守垃圾收集器来规避你的一些问题。 在许多系统上,你也可以借助valgrind来捕获内存泄漏