Windows XP 및 Windows 2000에서 Pageheap.exe를 사용하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 286470 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Microsoft Windows XP와 Microsoft Windows 2000에서 페이지 힙 도구(Pageheap.exe)를 사용하는 방법을 설명합니다.

추가 정보

Pageheap.exe는 힙 관련 손상을 찾을 수 있도록 페이지 힙 플래그를 설정합니다. 또한 Windows 2000 Professional 서비스 팩 2(SP2) 및 Windows XP Professional 시스템에서 실행되는 프로그램에서 누수를 검색할 수도 있습니다.

Pageheap.exe는 할당, 해제, 기타 힙 작업 등의 모든 동적 메모리 작업을 확인하는 소프트웨어 유효성 검사 계층(페이지 힙 관리자)을 응용 프로그램과 시스템 사이에 도입합니다. 페이지 힙 관리자가 설정되면 테스트 중인 응용 프로그램이 디버거에서 시작됩니다. 문제가 발생하면 디버거가 중단됩니다.

중요 Pageheap.exe는 버그가 무엇인지 지정하지 않지만 문제가 발생하면 시스템을 중단시킵니다. 이렇게 되면 Windows 2000 Professional SP2 및 Windows XP Professional의 Ntdll.dll 시스템 라이브러리에 이미 있는 유효성 검사 계층이 활성화됩니다. Pageheap.exe는 이전 버전의 Microsoft Windows에서는 작동하지 않습니다.

테스트 중인 응용 프로그램이 디버거에서 시작되지 않고 버그가 발생하는 경우 피드백 없이 중단됩니다.

개념

응용 프로그램 개발에서 힙 손상은 일반적으로 발생하는 문제입니다. 이 문제는 일반적으로 응용 프로그램이 주어진 크기의 힙 메모리 블록을 할당한 다음 힙 블록의 요청된 크기를 초과하는 메모리 주소에 기록할 때 발생합니다. 힙 손상은 응용 프로그램이 이미 해제된 메모리 블록에 쓸 때도 발생할 수 있습니다.

두 가지 개념은 Pageheap.exe 관련 명령 및 그 사용 방법을 이해하는 데 매우 중요합니다.
  • 힙 블록의 손상은 할당 끝 부분에 액세스할 수 없는 페이지를 배치하거나, 블록이 해제되었을 때 채우기 패턴을 검사하여 발견됩니다.
  • 페이지 힙이 설정된 프로세스에서 만들어진 각 힙에는 전체 페이지 힙과 일반 페이지 힙이라는 두 가지 힙이 있습니다.
    • 전체 페이지 힙은 할당 끝 부분에 액세스할 수 없는 페이지를 배치하여 힙 블록의 손상을 나타냅니다. 이 방법의 장점은 "돌발 중단(sudden death)"을 수행할 수 있다는 것입니다. 즉, 프로세스가 정확한 오류 발생 지점에서 액세스 위반(AV)을 일으키게 됩니다. 따라서 오류를 디버그하기가 쉽습니다. 단점은 모든 할당이 커밋된 메모리를 한 페이지 이상 사용한다는 것입니다. 메모리를 많이 사용하는 프로세스의 경우 시스템 리소스가 빠르게 소모될 수 있습니다.
    • 일반 페이지 힙은 메모리 제한으로 인해 전체 페이지 힙을 사용할 수 없는 상황에서 사용할 수 있습니다. 힙 블록이 해제되었을 때 채우기 패턴을 검사합니다. 이 방법의 장점은 메모리 소모가 크게 줄어든다는 것입니다. 단점은 블록이 해제된 경우에만 손상이 검색된다는 것입니다. 따라서 오류를 디버그하기가 어렵습니다.

Pageheap 도구의 다운로드 위치

최신 디버그 도구 패키지를 다운로드하려면 다음 링크를 누르십시오.
http://www.microsoft.com/whdc/ddk/debugging/default.mspx(영문)


디버그 도구의 최신 릴리스를 선택합니다. 도구를 설치할 때 Custom 설치를 선택한 다음 적절한 이름의 디렉터리에 설치합니다. 예를 들어, C:\Debug나 C:\Debugtools에 도구를 설치합니다.

힙 블록 손상을 조사할 방법 선택

힙 블록의 손상은 대부분 다음 두 가지 방법 중 하나로 찾을 수 있습니다.
  • 전체 페이지 힙: 할당 끝 부분에 액세스할 수 없는 페이지를 배치합니다.
  • 일반 페이지 힙: 블록이 해제되었을 때 채우기 패턴을 검사합니다.

전체 페이지 힙

전체 페이지 힙은 개별 프로세스마다 설정하거나, 대형 프로세스의 경우 많은 메모리를 필요로 하기 때문에 매개 변수를 제한하여 설정해야 합니다. 필요한 페이지 파일 크기를 측정하기 어렵기 때문에 시스템 범위로는 설정할 수 없습니다. 시스템 범위의 전체 페이지 힙에 너무 작은 페이지 파일을 사용하면 시스템을 부팅할 수 없게 됩니다.

전체 페이지 힙의 장점은 프로세스가 오류 발생 지점에서 정확하게 액세스 위반(AV)을 일으킨다는 점입니다. 따라서 오류를 디버그하기가 쉽습니다. 오류를 정확하게 파악하려면 먼저 일반 페이지 힙을 사용하여 프로세스에서 오류가 발생하는 범위를 확인한 다음 대규모 개별 프로세스에서 제한된 할당 범위(즉, 특정 크기 범위 또는 특정 라이브러리)로 전체 페이지 힙을 사용하십시오.

일반 페이지 힙

일반 페이지 힙은 전체 페이지 힙과 달리 대량의 메모리 소모 없이 대규모 프로세스를 테스트하는 데 사용할 수 있습니다. 그러나 일반 페이지 힙은 블록이 해제될 때까지 검색이 지연되므로 오류를 디버그하기가 더욱 어렵습니다.

일반적으로 초기의 대규모 프로세스 테스트에 일반 페이지 힙을 사용합니다. 그런 다음 문제가 검색되면 이러한 프로세스에서 제한된 할당 범위로 전체 페이지 힙을 설정합니다.

일반 페이지 힙은 모든 프로세스에 대해 시스템 범위로 안전하게 설정할 수 있습니다. 따라서 구성 요소 중심의 테스트보다는 일반적인 시스템 검사를 수행하는 테스트 벤치에 매우 유용합니다. 일반 페이지 힙은 단일 프로세스에 대해서도 설정할 수 있습니다.

시스템 범위 페이지 힙에 GFlags 사용

GFlags 도구는 시스템 범위 페이지 힙을 설정하는 데 사용됩니다. GFlags 명령을 적용하려면 명령을 실행한 후 컴퓨터를 다시 시작해야 합니다.

시스템 범위 일반 페이지 힙을 설정하려면 다음과 같이 하십시오.
  1. 명령줄에 다음을 입력합니다.

    gflags -r +hpa
  2. 컴퓨터를 다시 시작합니다.
시스템 범위 일반 페이지 힙을 해제하려면 다음과 같이 하십시오.
  1. 명령줄에 다음을 입력합니다.

    gflags -r -hpa
  2. 컴퓨터를 다시 시작합니다.
참고 페이지 힙을 설정하면 다른 GFlags 설정은 유용하지 않습니다. 힙과 관련하여 나타나는 다른 설정을 활성화하면 페이지 힙 관리자와 "무해한" 힙 플래그 사이의 충돌로 인해 페이지 힙 버그가 발생할 수 있습니다.

단일 프로세스 페이지 힙에 GFlags 사용

특정 프로세스를 모니터링하기 위해 페이지 힙을 사용할 수 있도록 설정할 수 있습니다. 이렇게 하려면 다음 단계를 수행하십시오.
  1. 명령 프롬프트에서 디버그 도구를 설치한 디렉터리로 변경합니다.
  2. 명령 프롬프트에서 다음을 입력한 후 Enter 키를 누릅니다.
    Gflags.exe ?p /enable lsass.exe
    참고 lsass.exe는 Pageheap 도구로 모니터링할 프로세스의 이름을 나타냅니다.
  3. 페이지 힙 모니터링이 더 이상 필요하지 않으면 모니터링을 해제합니다. 수신 대기 포트의 목록을 얻으려면 프롬프트에서 다음 명령을 입력하고 Enter 키를 누릅니다.
    Gflags.exe -p /disable lsass.exe
    참고 lsass.exe는 Pageheap 도구로 모니터링할 프로세스의 이름을 나타냅니다.
  4. 현재 Pageheap 확인을 사용하는 모든 프로그램을 표시하려면 명령 프롬프트에서 다음을 입력한 다음 Enter 키를 누릅니다.
    Gflags.exe -p

정렬되지 않은 할당

Windows 힙 관리자(모든 버전)는 항상 힙 할당의 시작 주소가 8바이트로 정렬(64비트 플랫폼에서는 16바이트로 정렬)되도록 합니다. 페이지 힙 관리자도 동일한 기능을 수행합니다. 그러나 할당 끝과 페이지 끝을 정확히 일치시킬 수는 없습니다. 한 바이트 이탈(off-by-one-byte) 오류가 액세스할 수 없는 페이지에서 읽기 또는 쓰기를 유발하면 즉시 오류를 일으킬 수 있도록 정확한 페이지 끝 할당이 필요합니다.

사용자 요청 블록 크기가 8바이트로 정렬되지 않은 경우 페이지 힙은 "8바이트로 정렬된 시작 주소" 및 "페이지로 정렬된 끝 주소" 제한 조건을 모두 충족시킬 수 없습니다. 해결 방법은 첫 번째 제한 조건을 충족시키고 블록의 시작을 8바이트로 정렬하는 것입니다. 그런 다음 블록이 끝나고 액세스할 수 없는 페이지가 시작되는 영역에 작은 채우기 패턴을 사용합니다. 이 채우기 패턴의 길이는 32비트 아키텍처에서 0-7바이트일 수 있습니다. 채우기 패턴은 해제 시 검사됩니다.

이러한 할당에 대해 즉시 오류를 검색하지 않으면 끝 부분에 채우기 패턴을 갖게 되는 경우 페이지 힙 관리자가 8바이트 정렬 규칙을 무시하고 항상 /unaligned/full 매개 변수를 사용하여 페이지 경계에서 할당의 끝을 정렬하도록 하십시오. 자세한 내용은 /unaligned 매개 변수를 참조하십시오.

참고: 일부 프로그램은 8바이트 정렬을 가정하고 /unaligned 매개 변수를 사용하여 올바르게 작동을 중지합니다. Microsoft Internet Explorer는 이러한 프로그램 중 하나입니다.

전체 페이지 힙 할당을 위한 커밋되지 않은 페이지

핵심 전체 페이지 힙 구현은 한 페이지보다 작은 할당에 대해 두 페이지를 커밋합니다. 한 페이지는 사용자 할당에 사용되고 다른 페이지는 버퍼 끝에서 액세스할 수 없도록 만들어집니다.

버퍼 끝 오버런은 액세스할 수 없는 커밋된 페이지 대신 예약된 가상 공간 영역을 사용하여 검색할 수 있습니다. 프로세스가 이 예약된 가상 공간을 사용할 때 액세스 위반 예외가 발생합니다. 이 방법은 메모리 소모를 50%까지 줄일 수 있습니다. 자세한 내용은 /decommit 매개 변수를 참조하십시오.

오류 삽입

일부 할당이 의도적으로 실패하도록 페이지 힙 관리자를 제어할 수 있습니다. 이 방법은 실제로 모든 시스템 리소스를 사용하지 않고 메모리 부족 조건을 시뮬레이션하는 데 유용합니다.

1에서 10,000 사이의 숫자를 지정하여 할당에 실패할 확률을 나타냅니다. 확률이 10,000이면 할당은 100% 실패합니다. 확률이 2,000이면 할당이 약 20% 실패합니다.

페이지 힙 관리자는 프로세스 수명의 처음 5초와 Windows NT 로더 코드 경로(예: LoadLibrary, FreeLibrary)에서 모두 오류 삽입을 피하기 위해 특별한 주의를 기울입니다. 프로세스를 시작하는 데 5초로 충분하지 않으면 프로세스 시작 시의 시간 초과를 더 길게 지정할 수 있습니다. 자세한 내용은 /fault 매개 변수를 참조하십시오.

/fault 매개 변수를 사용할 때 테스트 중인 프로세스에 버그가 있으면 예외가 발생합니다. 일반적으로 할당 작업이 NULL을 반환한 후 응용 프로그램이 할당된 메모리에 액세스하려고 하기 때문입니다. 할당에 실패했기 때문에 메모리에 액세스할 수 없으며, 따라서 액세스 위반이 발생합니다.

예외가 발생하는 다른 이유는 응용 프로그램이 할당 오류를 처리하려고 하지만 일부 리소스를 해제하지 않기 때문입니다. 이것은 메모리 누수로 나타나며 디버그하기 더 어렵습니다.

이러한 오류를 진단하기 위해 페이지 힙 관리자는 오류 삽입 순간의 스택 추적 기록을 유지합니다. 이 추적은 다음 디버거 명령으로 표시할 수 있습니다.

!heap -p -f [NUMBER-OF-TRACES]

기본적으로 확장 명령은 최근 4개의 추적만 표시합니다.

응용 프로그램을 시작할 때 자동으로 디버거 연결

일부 응용 프로그램은 명령 프롬프트에서 시작하기 어렵거나 다른 프로세스로부터 만들어집니다. 이러한 응용 프로그램의 경우 시작할 때마다 디버거가 자동으로 연결되도록 지정합니다. 이것은 해당 프로세스에 대해 페이지 힙이 설정되어 있고 힙 오류가 발생하는 경우 유용합니다. 자세한 내용은 /debug 매개 변수를 참조하십시오.

Pageheap.exe는 사용자 지정 할당/해제 기능이 결국 NT 힙 관리 인터페이스(예: RtlAllocateHeap, RtlFreeHeap)로 호출되는 한, C++ 스타일의 할당 생성 및 삭제를 비롯한 모든 메모리 할당 프로세스를 확인하는 데 효과적입니다. 다음 함수는 이러한 기능을 수행합니다.
  • HeapAlloc, HeapFree, HeapReAlloc 등의 함수: 이러한 함수는 kernel32.dll에서 내보내고 NT 힙 인터페이스로 직접 호출됩니다.
  • GlobalAlloc, GlobalFree, GlobalReAlloc 등의 함수: 이러한 함수는 kernel32.dll에서 내보내고 NT 힙 인터페이스로 직접 또는 간접적으로 호출됩니다.
  • LocalAlloc, LocalFree, LocalReAlloc 등의 함수: 이러한 함수는 kernel32.dll에서 내보내고 NT 힙 인터페이스로 직접 또는 간접적으로 호출됩니다.
  • malloc, free, realloc, msize, expand 함수: 이러한 함수는 msvcrt.dll에서 내보내고 NT 힙으로 직접 또는 간접적으로 호출됩니다. 이것이 항상 적용되는 것은 아닙니다. C 런타임은 이전에는 힙을 다르게 구현하는 데 사용되었지만 이제는 직접 NT 힙으로 호출됩니다.
  • new, delete, new[ ] , delete[ ] 연산자: 이러한 함수는 msvcrt.dll에서 내보내고 NT 힙으로 직접 또는 간접적으로 호출됩니다.
기타 모든 할당/해제 함수는 사용자 지정 스키마이며 NT 힙으로 직접 또는 간접적으로 호출되지 않습니다. 소스 코드를 검사하거나 디버거에서 실행하는 방법으로만 실제 구현을 알아낼 수 있습니다.

정적 연결은 사용하지 마십시오. 일부 응용 프로그램은 이전 버전의 C 런타임에 정적으로 연결되어 있습니다. 이러한 이전 버전은 Windows NT 힙 API를 호출하지 않으며 이러한 할당을 확인하는 데 Pageheap.exe를 사용할 수 없습니다. 동적 연결을 사용하면 최신 C 런타임 라이브러리(msvcrt.dll)를 얻을 수 있습니다.

Pageheap.exe에 의해 발견된 버그의 종류

Pageheap.exe는 대부분의 힙 관련 버그를 검색하지만 힙 손상 문제에 집중하며 누수에는 중점을 두지 않습니다. Pageheap.exe는 힙 누수를 찾는 기능이 있기는 하지만 잘 찾아내지는 못합니다.

Pageheap.exe의 장점 중 하나는 대부분의 오류가 발생하면 검색된다는 것입니다. 예를 들어, 동적으로 할당된 버퍼 끝의 한 바이트 이탈(off-by-one-byte) 오류는 즉시 액세스 위반을 초래할 수 있습니다. 발생할 때 검색하지 못하는 오류의 종류는 적습니다. 이러한 경우 블록이 해제될 때까지 오류 보고가 지연됩니다.
  • 잘못된 힙 포인터: 모든 Win32 및 Windows NT 수준 힙 인터페이스는 작업이 발생해야 하는 힙에 대한 포인터를 첫 번째 매개 변수로 사용합니다. 페이지 힙 관리자는 호출이 발생할 때 잘못된 힙 포인터를 검색합니다.
  • 잘못된 힙 블록 포인터: 블록은 할당된 후 특히 free() 유형의 인터페이스 같은 여러 힙 인터페이스에 대한 매개 변수로 사용할 수 있습니다. 페이지 힙 관리자는 잘못된 힙 블록 포인터를 즉시 검색합니다. 잘못된 주소가 몇 바이트 떨어져 있는지, 아니면 완전히 잘못되었는지 확인하는 방법은 페이지 힙 오류 디버깅(Debugging Page Heap Failures)을 참조하십시오.
  • 힙에 대한 다중 스레드 비동기 액세스: 일부 응용 프로그램은 다중 스레드에서 힙으로 호출됩니다. 이런 종류의 시나리오에서는 힙 잠금 획득을 트리거하는 플래그를 사용자가 설정해야 합니다. 페이지 힙 관리자는 두 스레드가 동시에 힙으로 호출을 시도할 때 이런 종류의 위반을 검색합니다.
  • 같은 주소에 있는 블록의 재할당에 대해 가정: 재할당 작업이 같은 주소를 반환하지는 않습니다. 블록 크기를 줄이는 재할당의 경우 특히 그렇습니다. 일부 응용 프로그램은 재할당이 같은 주소를 반환한다고 가정합니다. 페이지 힙 관리자는 항상 재할당하는 동안 새 블록을 할당하고 기존 블록을 해제합니다. 해제 블록은 읽기/쓰기 액세스로부터 보호되므로 이러한 블록에 대한 액세스는 모두 액세스 위반을 유발합니다.
  • 이중 해제: 같은 힙 블록을 여러 번 해제하는 이 버그는 일부 응용 프로그램에서 흔히 발생합니다. 이 버그는 두 번째 해제 시 해당 블록에 적절한 접두사 헤더가 없고 할당된 블록 중에서 발견할 수 없기 때문에 페이지 힙 관리자에 의해 즉시 검색됩니다. 첫 번째 해제 작업의 스택 추적을 분석하는 방법은 페이지 힙 오류 디버깅을 참조하십시오. 이 오류는 응용 프로그램이 블록 주소로 간주한 것을 해제할 때 이미 해당 블록이 재할당의 일부로 해제되어 있기 때문에 재할당 문제의 변형일 수 있습니다.
  • 해제 후 블록 액세스: 해제된 메모리 블록은 보호된 메모리 풀에서 페이지 힙 관리자에 의해 잠시 유지됩니다. 이러한 블록에 액세스하면 액세스 위반이 발생합니다. "위치" 원칙에 따라, 해제 보호된 풀이 충분히 클 경우 대부분의 문제가 발견됩니다. 해제된 블록이 여전히 보호된 풀에 있으면 버그는 즉시 발견됩니다. 그러나 메모리를 재사용한 경우에는 버그를 찾거나 원인이 되는 코드를 확인할 기회가 줄어듭니다.
  • 할당된 블록 뒤에 액세스: 페이지 힙 관리자는 액세스할 수 없는 페이지를 할당된 블록 바로 뒤에 배치합니다. 블록을 지나 액세스하면 액세스 위반이 발생합니다. 일부 응용 프로그램은 8바이트로 정렬된 할당을 예상합니다. 이 기능은 Windows NT 3.5 힙 관리자 이후로 지원되었습니다. 8바이트 정렬이 아닌 요청 크기도 8바이트로 정렬된 주소를 얻지만, 여전히 액세스할 수 있는 블록의 뒤에 몇 바이트가 남게 됩니다. 응용 프로그램에서 이러한 몇 바이트만 손상된 경우 블록이 해제될 때 블록 접미사 패턴만 검사하면 오류가 발견됩니다.
  • 할당된 블록 앞에 액세스: 페이지 힙 관리자가 설정 가능한 플래그를 통해 액세스할 수 없는 페이지를 블록의 끝이 아닌 시작 부분에 배치하도록 할 수 있습니다. 블록 앞에 액세스하면 액세스 위반이 발생합니다.
표 축소표 확대
오류일반 페이지 힙전체 페이지 힙
잘못된 힙 포인터즉시 발견즉시 발견
잘못된 힙 블록 포인터즉시 발견즉시 발견
비동기 액세스즉시 발견즉시 발견
재할당 주소에 대한 가정실제 해제될 때까지 90%90% 즉시 발견
이중 해제90% 즉시 발견90% 즉시 발견
해제 후 재사용실제 해제될 때까지 90%90% 즉시 발견
블록 뒤에 액세스해제되면 발견즉시 발견
블록 앞에 액세스해제되면 발견즉시 발견(특수 플래그)

페이지 힙 오류 디버깅

페이지 힙 오류 디버깅에 대한 자세한 내용은 Application Compatibility Toolkit에서 제공되는 Application Compatibility Tookit Reference를 참조하십시오.

Pageheap.exe의 구문과 Pageheap.exe의 사용 예제는 Application Compatibility Toolkit에서 제공되는 Application Compatibility Tookit Reference를 참조하십시오.

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
294895 Windows Application Compatibility Toolkit을 구하는 방법




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 286470 - 마지막 검토: 2006년 4월 21일 금요일 - 수정: 4.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows XP Professional
  • Microsoft Windows XP Home Edition
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Datacenter Server
키워드:?
kbinfo kbenv KB286470

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com