PageHeap 유틸리티를 사용하여 Visual C++ 프로젝트에서 메모리 오류 검색
이 문서에서는 PageHeap 유틸리티를 사용하여 Microsoft Visual C++ 프로젝트에서 메모리 오류를 검색하는 방법을 설명합니다. 이 문서의 정보는 관리되지 않는 Visual C++ 코드에만 적용됩니다.
원래 제품 버전: Visual C++
원본 KB 번호: 264471
요약
모든 malloc
, new
및 heapAlloc
할당이 메모리 오류에 대해 자동으로 모니터링되도록 애플리케이션에 대해 PageHeap 유틸리티를 사용하도록 설정할 수 있습니다.
PageHeap1 은 여러 유형의 메모리 오류가 있는 Visual C++ 프로젝트입니다. 이 샘플 애플리케이션에서 PageHeap을 사용하도록 설정하려면 명령줄에서 다음 콘텐츠를 입력합니다.
pageheap /enable pgh.exe 0x01
그런 다음, 다음 콘텐츠를 입력합니다.
pageheap
참고
PageHeap이 모니터링하는 애플리케이션 이름입니다.
많은 애플리케이션의 경우 가 0x01
필요한 유일한 플래그입니다. 명령줄에서 물음표 플래그(/?
)를 사용하여 PageHeap을 실행하여 사용 현황에 대한 자세한 정보를 얻을 수 있습니다.
PageHeap 작동 방식
PageHeap은 8바이트 경계에서 할당된 메모리에 대한 포인터를 반환합니다. 반환된 포인터의 끝에는 0~7바이트(요청된 크기에 따라 요청 크기를 8바이트 경계로 반올림하기 위해 0바이트에서 7바이트까지 추가됨) 뒤에 메모리 페이지가 표시됩니다 PAGE_NOACCESS
(자세한 내용은 VirtualAlloc 참조). 예를 들면
char * p;
p = new char[5];
PageHeap은 5바이트 및 3개의 가드 바이트에 대한 포인터를 반환하여 총 8바이트(예: )를 구성합니다..... Xxx. 메모리 할당 크기가 8의 배수인 경우 반환된 포인터에 추가된 보호 바이트가 없습니다.
할당의 끝을 덮어쓰면 보호 바이트가 변경되고 PageHeap으로 인해 메모리가 해제될 때 액세스 위반 오류가 발생합니다. 애플리케이션이 할당(가드 바이트 포함)을 읽거나 쓰는 경우 즉각적인 액세스 위반 오류가 발생합니다.
PageHeap1 샘플을 사용하는 방법
pgh 프로젝트를 빌드하고 pgh.exe 실행합니다.
참고
또는
malloc
를 사용new
하려면 PageHeap에 대한 릴리스 빌드를 수행해야 합니다.PageHeap1.exe 시작합니다. 대화 상자 팝업이 있습니다.
대화 상자에서 TextBox, 잘못된 할당/무료 검사 상자, 세 쌍의 단추, 새 & 삭제, PageAlloc & 힙 무료 및 COM 새 & COM Delete를 볼 수 있습니다. TextBox는 할당하려는 메모리 크기를 사용합니다. 잘못된 할당/무료 검사 상자를 선택하면 각 할당 유형(new, PageAlloc 및 COM new)이 메모리를 할당한 다음 할당을 지나서 씁니다. 잘못된 할당을 검사하지 않으면 메모리 덮어쓰기가 발생하지 않습니다.
새 단추는 연산자를 테스트하고
new
PageAlloc은 를 테스트합니다.HeapAlloc
COM 새 는 를 사용하지CoTaskMemAlloc
않고 단순히 를 호출하는 COM DLL(동적 링크 라이브러리)을 호출new
합니다. COM을 새로 테스트하려면 r1LeakMemMod.dll 등록하거나 r1LeakMemMod 프로젝트를 빌드해야 합니다.PageHeap이 작동하려면 런타임 DLL 라이브러리를 사용할 수 있습니다. (Visual C++ IDE(통합 개발 환경)에서 프로젝트>설정>C + +>범주: 코드 생성>런타임 라이브러리 사용).
잘못된 할당/무료 확인란을 선택한 후 메모리 할당 크기가 5바이트이면 새 단추를 선택하고 5바이트 메모리가 할당되고 0이 여섯 번째 바이트로 기록됩니다. 여섯 번째 바이트에 쓰는 것은 잘못된 메모리 덮어쓰기이지만 가드 바이트에서 발생하므로 PageHeap은 메모리가 삭제될 때까지 이 오류를 검색하지 않습니다. 삭제 단추를 선택하면 PageHeap에서 덮어쓰기를 감지하고 다음 예제와 유사한 오류 메시지 상자가 표시됩니다.
예외 중단점 A 중단점에 도달했습니다. (0x80000003) 위치 0x77f9f9df 애플리케이션에서 발생했습니다.
VISUAL C++가 JIT(Just-In-Time) 디버거로 지정된 경우 취소 단추를 선택하고 코드로 디버그할 수 있습니다.
할당 크기를 8(또는 8의 배수)로 변경하는 경우 새 단추, pageAlloc 또는 COM 새로 만들기 단추를 선택하면 액세스 권한이 없는 주소에 기록했기 때문에 즉각적인 액세스 위반 오류가 발생합니다. 즉, 오류를 감지하기 위해 메모리를 삭제할 필요가 없습니다.
참고
- 제한 사항: PageHeap은 패밀리(따라서 C++ 연산자
new
) 및heapAlloc
에서malloc
만 메모리 오류를 찾을 수 있습니다. 많은 애플리케이션에서 사용자 지정 할당자를 사용하며 PageHeap은 이러한 할당을 가로챌 수 없습니다. - 애플리케이션 테스트를 완료한 경우 명령줄에서 를 실행
pageheap /disable <appName>
하여 해당 애플리케이션에 대한 PageHeap을 끕니다. - PageHeap 사용 애플리케이션은 PageHeap을 사용하지 않고도 동일한 애플리케이션보다 훨씬 더 많은 메모리를 사용할 수 있습니다. 증가된 메모리 수요를 충족하기 위해 스왑 파일을 늘려야 할 수 있습니다.
여기에서 Pageheap1vcnet.exe 다운로드할 수 있습니다. Microsoft 지원 파일을 다운로드하는 방법에 대한 자세한 내용은 온라인 서비스 Microsoft 지원 파일을 가져오는 방법을 참조하세요.
Microsoft는 이 파일에서 바이러스를 검사했습니다. Microsoft는 파일이 게시된 날짜에 사용할 수 있는 최신 바이러스 감지 소프트웨어를 사용했습니다. 파일은 파일에 대한 무단 변경을 방지하는 데 도움이 되는 보안 강화 서버에 저장됩니다.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기