2009-07-15 7 views
0

Windows MFC 8.0 응용 프로그램 (릴리스 빌드)에서 메모리 누수를 찾으려고합니다.MFC 8.0 애플리케이션에서 mallocs의 전체 스택 추적에 액세스하는 방법은 무엇입니까?

인해 VC8 CRT's malloc problem with FPO에 WinDbg는 (또는 UMDH)를 사용하여 할당의 전체 스택 추적을 보여 실패 후, 나는 (즉 DbgHlp StackWalk에 LeakDiag를 사용하여 사용) 만 LeakDiag가하는 것을 실현하는 솔루션이 here을 제안 적용하려고했습니다 C 런타임 할당 자을 모니터링 할 때 로그 파일을 생성하지 마십시오. 그러나 Windows 힙 할당 자이 작동하지만 malloc 호출에서 스택 추적이 끝나는 것을 모니터링 할 때 로그 파일을 생성하지 마십시오.

생성 된 파일에서 함수 이름, 파일 이름, 행 등을 볼 수 있으므로 기호가 올바르게 구성되었습니다.

왜 내가 C 런타임 할당자를 로그 할 수 없는지 아는 사람? 왜 DbgHlp StackWalk API를 사용하더라도 전체 스택 추적을 얻을 수없는 이유는 무엇입니까?

제공할만한 힌트를 제공해 주시면 감사하겠습니다.

추가 정보 :

내 스택 추적 모습 방법 :이 사용 WinDbg가있어

. 주소는! heap -l에 의해 누수 된 블록으로보고 된 주소입니다. 나는 C 런타임 할당 자를 기록 할 수없는 이유

0:000> !heap -p -a 25b18400 
address 25b18400 found in 
_HEAP @ 2a70000 
    HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 
    25b183f8 0008 0000 [07] 25b18400 00021 - (busy) 
    Trace: 00a4 
    7c97d6dc ntdll!RtlDebugAllocateHeap+0x000000e1 
    7c959d18 ntdll!RtlAllocateHeapSlowly+0x00000044 
    7c92b298 ntdll!RtlAllocateHeap+0x00000e64 
    78134d83 MSVCR80!malloc+0x0000007a 

답변

1

타사 도구를 사용하지 않는 이유는 무엇입니까?

e.e. 인텔 평행 검사원의 평가 사본을 다운로드하십시오. 기존 릴리스 빌드에 비해 설치 및 실행이 간단합니다. 그리고 그것은 - 대부분의 경우에 - 완전한 스택을 보여줍니다 (나는 오탐 (false positive)도 발견하지만 꽤 확신합니다).

구성 관리자에서 릴리스 버전을 선택하고 링커 옵션에서 pdb 파일을 생성했는지 확인하십시오. 그런 다음 "Inspect Memory errors"를 시작하십시오.

다른 유사한 도구가 많이 있습니다. AQTime, GlowCode. 이들 모두는 재 컴파일이나 계측을 필요로하지 않습니다.

+0

나는 인텔 패러렐 스튜디오를 이미 시험해 보았지만 그냥 멈췄다 ... 꽤 무거워서 내 응용 프로그램이다. ... 그 이상으로, 내가 찾고있는 메모리 누출은 프로덕션에서만 발생한다. 개발자 도구가없는 컴퓨터. 나는 컴파일러를 설치할 수 있었지만, IPS가 내 개발 기계에서 시작조차 할 수 없다면 왜 귀찮았 는가 ... 내가 언급 한 다른 도구들을 살펴볼 것이다. 답변 해 주셔서 감사합니다. –

+0

평행 스튜디오의 마지막 버전은 훨씬 강력 해 보입니다. 베타 버전은 그렇지 않았습니다. 그러나 적어도 컴파일러없이 GlowCode를 사용할 수 있습니다. 지금까지 내가 말할 수있는 pdb 파일이 필요합니다. 나는 최근에 그것을 평가했다. 몇 가지 내부 오류가 발생했지만 실시간으로 작동하며 몇 가지 결과가 있습니다. –

+0

GlowCode는 훌륭한 프로파일 러 및 메모리 검사기로 보이지만, 주말 동안 내 응용 프로그램을 프로파일 링하는 데 심각한 문제가 있습니다. 어쨌든 아직 메모리 누수를 찾을 수는 없지만 유용하고 매우 빠르다는 것이 입증되었지만 MFC 8.0 응용 프로그램의 전체 스택 추적을 제공하므로 즉시 응답을 받아 들일 것입니다. . 감사합니다. –

1

는 아는 사람 있나요?

디버그 빌드를 사용하고 있습니까? Debug CRT에는 UMDH 및 글로벌 OS 힙에서 작동하는 다른 도구를 무효화하는 자체 힙 검사가 있습니다. UMDH 및 친구를 사용할 때 모든 MFC 및 MSVCRT 힙 디버깅 기능이 에서으로 해제되어 있는지 확인하십시오.

아마 또한, 또는 그렇지 않으면 0

의 기본에서 프로세스에 뭔가, changed the small-block allocator threshold, 8.0 릴리스 CRT해야 바로 앞으로 당신이 힙 디버깅 도구에 대한 원하는 것입니다 전역 힙에 요청합니다.

왜 DbgHlp StackWalk API를 사용하고 있어도 전체 스택 추적을 가져올 수 없습니까?

Skywing이 당신이 준 링크에서 세부 사항을 잘 설명했다고 생각합니다. 다시 반복하기 만하면 디버그 기호가 아닌 특정 함수에 첨부 된 메타 데이터가 없기 때문에 "x86에서 완벽하지 않은"스택 추적은 일반적으로 불가능합니다. 과거를 풀어 라. " DbgHlp가 EBP를 스크래치 레지스터로 사용하여 함수 (예 : MSVCRT의 malloc)를 푸는 것은 실제로 불가능합니다.

물론 원본을 수정하여 자신의 CRT를 다시 빌드하거나 CRT malloc/free를 대체 할 수 있습니다.

실제로 스택 언 와인딩이 확실히 신뢰할 수있는 x64 플랫폼에서 누출을 재생하는 것이 가장 좋습니다.

관련 문제