PageHeap 유틸리티를 사용하여 Visual C++ 프로젝트에서 메모리 오류 검색

이 문서에서는 PageHeap 유틸리티를 사용하여 Microsoft Visual C++ 프로젝트에서 메모리 오류를 검색하는 방법을 설명합니다. 이 문서의 정보는 관리되지 않는 Visual C++ 코드에만 적용됩니다.

원래 제품 버전: Visual C++
원본 KB 번호: 264471

요약

모든 malloc, newheapAlloc 할당이 메모리 오류에 대해 자동으로 모니터링되도록 애플리케이션에 대해 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 샘플을 사용하는 방법

  1. pgh 프로젝트를 빌드하고 pgh.exe 실행합니다.

    참고

    또는 malloc를 사용 new 하려면 PageHeap에 대한 릴리스 빌드를 수행해야 합니다.

    PageHeap1.exe 시작합니다. 대화 상자 팝업이 있습니다.

  2. 대화 상자에서 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 + +>범주: 코드 생성>런타임 라이브러리 사용).

  3. 잘못된 할당/무료 확인란을 선택한 후 메모리 할당 크기가 5바이트이면 새 단추를 선택하고 5바이트 메모리가 할당되고 0이 여섯 번째 바이트로 기록됩니다. 여섯 번째 바이트에 쓰는 것은 잘못된 메모리 덮어쓰기이지만 가드 바이트에서 발생하므로 PageHeap은 메모리가 삭제될 때까지 이 오류를 검색하지 않습니다. 삭제 단추를 선택하면 PageHeap에서 덮어쓰기를 감지하고 다음 예제와 유사한 오류 메시지 상자가 표시됩니다.

    예외 중단점 A 중단점에 도달했습니다. (0x80000003) 위치 0x77f9f9df 애플리케이션에서 발생했습니다.

    VISUAL C++가 JIT(Just-In-Time) 디버거로 지정된 경우 취소 단추를 선택하고 코드로 디버그할 수 있습니다.

    할당 크기를 8(또는 8의 배수)로 변경하는 경우 새 단추, pageAlloc 또는 COM 새로 만들기 단추를 선택하면 액세스 권한이 없는 주소에 기록했기 때문에 즉각적인 액세스 위반 오류가 발생합니다. 즉, 오류를 감지하기 위해 메모리를 삭제할 필요가 없습니다.

참고

  1. 제한 사항: PageHeap은 패밀리(따라서 C++ 연산자new) 및 heapAlloc에서 malloc 만 메모리 오류를 찾을 수 있습니다. 많은 애플리케이션에서 사용자 지정 할당자를 사용하며 PageHeap은 이러한 할당을 가로챌 수 없습니다.
  2. 애플리케이션 테스트를 완료한 경우 명령줄에서 를 실행 pageheap /disable <appName> 하여 해당 애플리케이션에 대한 PageHeap을 끕니다.
  3. PageHeap 사용 애플리케이션은 PageHeap을 사용하지 않고도 동일한 애플리케이션보다 훨씬 더 많은 메모리를 사용할 수 있습니다. 증가된 메모리 수요를 충족하기 위해 스왑 파일을 늘려야 할 수 있습니다.

여기에서 Pageheap1vcnet.exe 다운로드할 수 있습니다. Microsoft 지원 파일을 다운로드하는 방법에 대한 자세한 내용은 온라인 서비스 Microsoft 지원 파일을 가져오는 방법을 참조하세요.

Microsoft는 이 파일에서 바이러스를 검사했습니다. Microsoft는 파일이 게시된 날짜에 사용할 수 있는 최신 바이러스 감지 소프트웨어를 사용했습니다. 파일은 파일에 대한 무단 변경을 방지하는 데 도움이 되는 보안 강화 서버에 저장됩니다.