0

프린터 드라이버에서 메모리 누수를 디버그하려고합니다. windbg의 heap -s를 사용하여 힙을 분석하면 어떤 증가도 보이지 않기 때문에 리소스 누출 일뿐입니다. 바람둥이로 다른 종류의 물건을 어떻게 모니터합니까? GDI 개체 및 열린 핸들 수가 증가하지 않으므로 그럴 수 있습니까?프린터 드라이버에서 리소스 누수 디버깅

메모리 누수의 증상은 개인 바이트가 180MB까지 증가하고 인쇄가 임의의 문제를 겪기 시작한다는 것입니다.

답변

1

VirtualAlloc으로 직접 전화 할 수 있습니다. !address -summary을 사용하여 메모리 유형을 분리하십시오. 더 나은 방법은 이전 리소스 키트에서 vadump.exe 사본을 찾는 것입니다. 그것은 더 읽기 쉬운 고장을 제공합니다.

WinDbg의 !vadump 명령을 두 번 실행 한 결과를 차별화하고 새로 할당 된 RAM을 덤프하면 몇 가지 단서를 얻을 수 있습니다. 기호 파일이 있고 dps 명령을 사용하여 RAM을 덤프하면 WinDbg는 각 DWORD에 대해 일치하는 기호를 표시합니다. 즉, 값의 이름이 기호 파일에 있으면 해당 기호 파일을 볼 수 있습니다. 그 좋은 예가 VTables로 C++ 객체를 덤프하는 것입니다. VTable에는 기호가 있으므로 어떤 유형인지 알 수 있습니다.

마지막으로, VirtualAlloc에 중단 점을 설정하고 각 호출마다 스택을 덤프 할 수 있습니다. allocs와 frees 사이의 엄격한 비교가 없다하더라도 흥미로운 호출 스택이나 할당 크기를 알 수 있습니다. 스택을 덤프하고 계속할 중단 점 구문은 다음과 같습니다.

bp kernel32!virtualalloc "kb;g" 

또한 VirtualAllocEx에 중단 점을 지정하십시오. AFAIK, 대부분의 프로세스 초기화 VAD 할당은 파일 매핑 (CreateFileMapping/MapViewOfFile)과과 같이 커널에 구현 된 것을 제외하고는 중단 점에 도달해야합니다.

+0

도움 주셔서 감사합니다. vadump.exe는 많은 차이점을 보입니다. 너무 많이보아야합니다. 주소 - 요약은 한 지역을 보여줍니다. 1886000 (25112) : 01.20 % 50.05 % : RegionUsageIsVAD 가 증가하고 있습니다. 나는 이것이 VirtualAlloc을 가리킨다 고 생각한다. 그러나 virtualalloc의 중단 점은 전혀 충돌하지 않습니다. VirtualAlloc에는 가까운 친척이 있나요? –

+0

사실 diffing! 주소 출력이 끝나면 새로운 4Kb 영역이 RegionUsageIsVAD 영역에 할당 된 것을 볼 수 있습니다. 그러나 어떻게 할당했는지 알아낼 수 있습니까? –

관련 문제