2010-12-21 2 views
2

Windows의 C++ 응용 프로그램에서 메모리 누수를 추적하려고하는데 많은 양의 누출 된 객체가있는 응용 프로그램의 메모리 덤프가 있습니다. Windbg에서 객체를 생성 한 스택 추적을 추적하십시오.

// Get heap stats 
!heap -s 

는 다음을 보여줍니다 :

Heap  Flags Reserv Commit Virt Free List UCR Virt Lock Fast 
        (k)  (k) (k)  (k) length  blocks cont. heap 
----------------------------------------------------------------------------- 
00150000 00000002 1024 272 272  20  2  1 0  0 L 
00250000 00001002  64  24  24  9  1  1 0  0 L 
00260000 00008000  64  12  12  10  1  1 0  0  
003a0000 00001002  64  24  24  1  0  1 0  0 L 
003d0000 00001002 392256 292256 292256  3  1  1 0  49 L 
00bb0000 00001002  64  56  56  1  1  1 0  0 L 
00c30000 00001002  64  32  32  7  1  1 0  0 L 
----------------------------------------------------------------------------- 

그래서 누출을 포함 003d0000 그 힙을 볼 수 있습니다 내가 사용하므로 객체 :

나는 다음을 수행하여 그들을 추적하기가 Windbg를 사용하고 있습니다
// Get individual heap stats 
!heap -stat -h 003d0000 

보여주는 :

heap @ 003d0000 
    group-by: TOTSIZE max-display: 20 
    size  #blocks  total  (%) (percent of total busy bytes) 
    98 105de3 - 9b7bec8 (61.59) 
    50 f052f - 4b19eb0 (29.75) 
    8 21829f - 10c14f8 (6.64) 
    2a0 881 - 1652a0 (0.55) 
    d0 a5e - 86c60 (0.21) 
    48 19a1 - 73548 (0.18) 
    c0 8f0 - 6b400 (0.17) 
    490 155 - 613d0 (0.15) 
    40 1300 - 4c000 (0.12) 
    20 1ff1 - 3fe20 (0.10) 
    7c 7e1 - 3d0fc (0.09) 
    28 120c - 2d1e0 (0.07) 
    8708 5 - 2a328 (0.07) 
    34 8f4 - 1d190 (0.05) 
    e0 1dd - 1a160 (0.04) 
    bb88 2 - 17710 (0.04) 
    f0 12b - 11850 (0.03) 
    30 45d - d170 (0.02) 
    10 b73 - b730 (0.02) 
    90 f4 - 8940 (0.01) 
,536,913,632 이 보여줍니다

!heap -flt s 98 

: 10

그래서 나는 규모가 98 바이트, 내가 그 목적이 무엇인지 추적 할 수있는 개체의 누수가

<snip> 
19f56c38 0014 0014 [01] 19f56c40 00098 - (busy) 
     MyApp!MyObject::`vftable' 
<snip> 

Windbg에서의 내 지식이 실행되는 곳입니다 밖으로, 나는 힙에있는 객체가 클래스 MyObject 인 것을 볼 수 있지만 어떻게이 객체가 만들어 졌는지 알 수 있습니까?

도움이 필요하시면 대단히 감사하겠습니다.

감사합니다, J

답변

3

Here 좋은, 짧은 튜토리얼입니다. 그러나 스택 추적을 얻으려면 일부 전역 플래그를 활성화해야합니다. 또한 플랫폼/구성에 따라 불행한 problem으로 실행될 수 있습니다.

+0

Perfect! 그게 바로 제가 찾던 것입니다. 내가보고있는 동안 나는 그 기사 위에 실제로 미끄러졌다. 그러나 정상에서 gflags를 완전하게 놓쳤다. 감사. – JWood

0

-heap -stackwalk HeapCreate+HeapAlloc+HeapRealloc과 같은 플래그를 사용하여 Windows 성능 도구 키트의 XPerf와 함께 사용할 수도 있습니다. 그러면 메모리가 할당되었지만 해제되지 않은 위치에 대한 훌륭한 프로파일 러 스타일의 분석을 얻을 수 있습니다.