2010-02-05 4 views
1

매분마다 약 4kb의 개인 메모리가 누출되는 것으로 보이는 콘솔 멀티 애플리케이션 콘솔이 있습니다.공회전시 Windows 콘솔 응용 프로그램이 누출되는 이유는 무엇입니까? (그리고 왜 smoke gun은 kernel32.dll을 가리 킵니까?)

누수를 현지화하기 위해 누수가 멈출 때까지 응용 프로그램의 각 스레드를 점차 일시 중단했습니다. 그리고 놀랍게도 범인은 "Win32Thread"라는 스레드 인 것 같습니다.

내가 명시 적으로 시작한 스레드처럼 보이지 않습니다. 내가 연결하고 응용 프로그램을 중단하는 경우

는 스택 추적은 다음과 같습니다

[email protected]() 
    [email protected]() + 0xc bytes 
    [email protected]() + 0x15 bytes  
> [email protected]() + 0xfd bytes 
    [email protected]() + 0x25 bytes 
    [email protected]() + 0x34 bytes 
이 갑자기 누출 왜

사람이 어떤 생각을 가지고 있습니까?

응용 프로그램은 Win2k3 SP2 이중 코어 시스템에서 약 40 시간 동안 실행되었습니다.

모든 아이디어가 대단히 감사하겠습니다.

답변

2

스택 추적 코드는 타이머 관련 코드에있는 것처럼 보입니다. 나는 귀하의 코드 (또는 귀하가 사용하는 라이브러리)가 timeSetEvent 또는 유사한 기능을 사용하여 타이머를 시작했다고 추측 할 수 있습니다. 이 경우 누수가 아마도 타이머 콜백 함수에있을 것입니다.

멀티미디어 타이머를 시작하면 스레드가 만들어지고 해당 스레드에서 콜백이 호출됩니다. 정기적 인 타이머를 사용하면 유휴 상태에서 누출되는 이유를 알 수 있습니다.

0

응용 프로그램에 APC (비동기 프로 시저 호출) 또는 예약 된 타이머 이벤트가 있습니까? 멀티미디어 타이머 콜백이 발생합니다.

콜백이 C 런타임 호출을 사용하는 경우 이러한 호출은 작업 (_tcstol, sprintf 등)을 수행하기 위해 일회용 스레드 로컬 할당 (느리게, 스레드에서 함수가 처음 호출 될 때 할당 됨)을 만듭니다. 스레드가 beginthread() 또는 beginthreadex()로 시작되지 않았기 때문에이 메모리는 스레드가 종료 될 때 정리할 수 없으므로 누출로 나타납니다.