собственная утечка памяти - как найти колл-стэк источника выделения - PullRequest
3 голосов
/ 01 ноября 2011

Основываясь на следующем выводе команды! 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, я не получаюлюбой callstack, просто следующий.Любые идеи, как получить callstack выделения источника?

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)  

Ответы [ 4 ]

2 голосов
/ 13 декабря 2011

используйте valgrind для Linux и deleteaker для Windows.

2 голосов
/ 09 декабря 2011

Вы должны использовать deleteaker. Это мощный инструмент для отладки.

1 голос
/ 01 ноября 2011

Если вы не получаете стек вызовов от !heap -p -a
Причиной может быть то, что вы не правильно использовали gflags
Помните, чтобы использовать правильное имя, включая .exe
Попробуйте запустить его интерактивно и перейти на вкладку изображения, может быть проще
Попробуйте с кучей страниц, это также дает стек вызовов

1 голос
/ 01 ноября 2011

Я ничего не знаю о Windows, но, по крайней мере, в системах Unix отладчик (например, gdb в Linux) полезен для понимания стеков вызовов.

И вы также можете обойти некоторые проблемы, используя, например, Консервативный сборщик мусора Бома .Во многих системах вы также можете отследить утечки памяти с помощью valgrind

...