낮은 리소스 시뮬레이션

낮은 리소스 시뮬레이션 옵션(Windows 8.1 임의로 낮은 리소스 시뮬레이션이라고 함)이 활성화된 경우 드라이버 검증 도구는 드라이버가 메모리가 부족한 컴퓨터에서 실행 중일 때와 마찬가지로 드라이버 메모리 할당의 임의 인스턴스에 실패합니다. 이렇게 하면 낮은 메모리 및 기타 리소스 부족 조건에 제대로 응답하는 드라이버의 기능이 테스트됩니다.

낮은 리소스 시뮬레이션 테스트는 ExAllocatePoolWithXXX, MmGetSystemAddressForMdlSafe, MmProbeAndLockPages, MmMapLockedPagesSpecifyCacheMmMapIoSpace를 비롯한 여러 함수에 대한 호출에 의해 요청된 할당에 실패합니다.

Windows Vista부터 낮은 리소스 시뮬레이션 테스트는 IoAllocateIrp, IoAllocateMdl, IoAllocateWorkItem, IoAllocateErrorLogEntry, MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache, MmAllocatePagesForMdlMmAllocatePagesForMdlEx에도 오류를 삽입합니다. 또한 Windows Vista부터 낮은 리소스 시뮬레이션을 사용하도록 설정하면 경고 가능 매개 변수가 TRUE로 설정된 KeWaitForMultipleObjects 또는 KeWaitForSingleObject에 대한 호출은 권한이 없는 프로세스의 컨텍스트에서 실행될 때 STATUS_ALERTED 반환할 수 있습니다. 이렇게 하면 권한이 없는 동일한 애플리케이션의 다른 스레드에서 발생할 수 있는 스레드 경고가 시뮬레이션됩니다.

낮은 리소스 시뮬레이션 테스트는 다음과 같은 GDI 함수인 EngAllocMem에 오류를 삽입합니다. EngAllocUserMem, EngCreateBitmap, EngCreateDeviceSurface, EngCreateDeviceBitmap, EngCreatePalette, EngCreateClip, EngCreatePath, EngCreateWnd, EngCreateDriverObj, BRUSHOBJ_pvAllocRbrushCLIPOBJ_ppoGetPath.

Windows 7 이상 버전의 Windows 운영 체제에서 낮은 리소스 시뮬레이션 옵션은 다음 커널 API를 사용하여 할당된 메모리를 지원합니다.

Windows 8.1 시작하여 낮은 리소스 시뮬레이션 옵션은 MmAllocateNodePagesForMdlEx 호출에서 요청한 할당에도 실패합니다. 또한 일부 함수의 경우 드라이버 검증 도구는 이제 할당된 메모리를 임의 패턴으로 채웁니다. 그러나 함수가 초기화되지 않은 메모리를 반환하는 경우에만 대표적인 함수는 다음과 같습니다.

낮은 리소스 시뮬레이션에 대한 사용자 지정 설정

Windows Vista 이상 버전의 Windows에서 다음 사용자 지정 설정을 지정할 수 있습니다.

  • 지정된 할당이 실패할 확률입니다. 기본값은 6%입니다.

  • 영향을 받는 애플리케이션. 이 설정은 삽입된 실패한 할당을 지정된 애플리케이션으로 제한합니다. 기본적으로 모든 할당이 영향을 받습니다.

  • 영향을 받는 풀 태그입니다. 이 설정은 삽입된 오류를 지정된 풀 태그가 있는 할당으로 제한합니다. 기본적으로 모든 할당이 영향을 받습니다.

  • 할당이 실패하기 전에 지연(분)입니다. 이 지연을 통해 오류를 주입하기 전에 시스템을 시작하고 안정화할 수 있습니다. 기본값은 8분입니다.

Windows Vista 이전의 운영 체제에서는 이러한 설정을 사용자 지정할 수 없습니다. 운영 체제는 기본값을 사용합니다.

다시 부팅하지 않고 낮은 리소스 시뮬레이션

/volatile 매개 변수를 사용하여 컴퓨터를 다시 시작하지 않고도 Windows 2000 이상 버전의 Windows에서 낮은 리소스 시뮬레이션을 활성화할 수 있습니다. 설정은 즉시 유효하지만 컴퓨터를 종료하거나 다시 시작하면 손실됩니다.

/volatile 매개 변수를 생략하여 레지스트리에 낮은 리소스 시뮬레이션 설정을 저장할 수도 있습니다. 이러한 설정은 컴퓨터를 다시 시작할 때만 유효하지만 변경할 때까지 유효합니다.

이 옵션 활성화

드라이버 검증 도구 관리자 또는 Verifier.exe 명령줄을 사용하여 하나 이상의 드라이버에 대해 낮은 리소스 시뮬레이션 옵션을 활성화할 수 있습니다. 자세한 내용은 드라이버 검증 도구 옵션 선택을 참조하세요.

  • 명령줄에서

    명령줄에서 리소스 부족 시뮬레이션 옵션은 비트 2(0x4)로 표시됩니다. 낮은 리소스 시뮬레이션을 활성화하려면 0x4 플래그 값을 사용하거나 플래그 값에 0x4 추가합니다. 예:

    verifier /flags 0x4 /driver MyDriver.sys
    

    옵션은 다음 부팅 후 활성화됩니다.

    Windows Vista 이상 버전의 Windows에서는 /faults 매개 변수 또는 0x4 플래그 값을 사용하여 낮은 리소스 시뮬레이션을 활성화할 수 있습니다. 낮은 리소스 시뮬레이션에 대한 설정을 수정하려면 /faults를 사용해야 합니다. 예:

    verifier /faults /driver MyDriver.sys
    

    Windows 2000 이상 버전의 Windows에서는 / volatile 매개 변수를 명령에 추가하여 컴퓨터를 다시 부팅하지 않고도 낮은 리소스 시뮬레이션을 활성화하고 비활성화할 수도 있습니다. 예:

    verifier /volatile /flags 0x4 /adddriver MyDriver.sys
    

    이 설정은 즉시 적용되지만 컴퓨터를 종료하거나 다시 부팅하면 손실됩니다. 자세한 내용은 휘발성 설정 사용을 참조하세요.

    Windows Vista에서 /faults 매개 변수를 사용하여 /volatile 매개 변수를 사용하여 낮은 리소스 시뮬레이션을 나타내며 다시 부팅하지 않고도 효과적인 설정을 나타낼 수 있습니다. 설정 변경 내용이 표시됩니다. 예:

    0>  verifier /volatile /faults /adddriver MyDriver.sys
    New Low Resources Simulation options:
    
    - Use default fault injection probability.
    - Allocations using any pool tag can be failed.
    - Simulate low resources conditions in any application.
    
    The new settings are in effect until you restart this computer
    or change them again.
    
  • 드라이버 검증 도구 관리자 사용

    1. 드라이버 검증 도구 관리자를 시작합니다. 명령 프롬프트 창에 검증 도구를 입력합니다.
    2. 사용자 지정 설정 만들기(코드 개발자용)를 선택하고 다음을 클릭합니다.
    3. 전체 목록에서 개별 설정 선택을 선택합니다.
    4. 낮은 리소스 시뮬레이션을 선택합니다.

설정 사용자 지정(Windows Vista 이상)

Windows Vista부터 낮은 리소스 시뮬레이션 옵션의 지연, 확률, 애플리케이션 및 풀 태그 속성에 대한 기본 설정을 변경할 수 있습니다. 드라이버 검증 도구 관리자 또는 Verifier.exe 명령줄을 사용하여 이러한 설정을 변경할 수 있습니다. 자세한 내용은 드라이버 검증 도구 옵션 선택을 참조하세요.

명령줄에서 이러한 설정의 구문은 다음과 같습니다.

검증 도구 [/volatile] /faults[Probability|PoolTags|Applications|DelayMins][/driver|DriverList]

참고 사용자 지정 설정 매개 변수는 표시된 순서대로 표시되어야 합니다. 값을 생략하면 따옴표를 입력하여 해당 위치를 유지합니다.

하위 매개 변수

  • /오류

    드라이버 검증 도구에서 낮은 리소스 시뮬레이션 옵션을 사용하도록 설정합니다. (사용자 지정 설정 하위 매개 변수에는 /flags 0x4 사용할 수 없습니다.)

  • Probability

    드라이버 검증 도구가 지정된 할당에 실패할 확률을 지정합니다. 숫자(10진수 또는 16진수 형식)를 입력하여 드라이버 검증 도구가 할당에 실패할 확률(10,000)을 나타냅니다. 기본값인 600은 600/10000 또는 6%를 의미합니다.

  • PoolTags

    드라이버 검증 도구가 지정된 풀 태그를 사용하여 할당에 실패할 수 있는 할당을 제한합니다. 와일드카드 문자(*)를 사용하여 여러 풀 태그를 나타낼 수 있습니다. 여러 풀 태그를 나열하려면 태그를 공백으로 구분합니다. 기본적으로 모든 할당은 실패할 수 있습니다.

  • 애플리케이션

    드라이버 검증 도구가 지정된 프로그램에 대한 할당에 실패할 수 있는 할당을 제한합니다. 실행 파일의 이름을 입력합니다. 프로그램을 나열하려면 프로그램 이름을 공백으로 구분합니다. 기본적으로 모든 할당은 실패할 수 있습니다.

  • DelayMins

    드라이버 검증 도구가 의도적으로 할당에 실패하지 않는 동안 부팅 후의 시간(분)을 지정합니다. 이 지연을 통해 테스트가 시작되기 전에 드라이버를 로드하고 시스템을 안정화할 수 있습니다. 숫자를 입력합니다(10진수 또는 16진수 형식). 기본값은 8(분)입니다.

예를 들어 다음 명령을 사용하면 풀 태그, Tag1 및 Fred 및 애플리케이션 Notepad.exe 대해 10%(1000/10000)의 확률과 5분의 지연으로 낮은 리소스 시뮬레이션을 사용할 수 있습니다.

verifier /faults 1000 "Tag1 Fred" Notepad.exe 5

다음 명령은 지연 시간을 10분으로 연장한다는 점을 제외하고 기본값으로 낮은 리소스 시뮬레이션을 사용하도록 설정합니다.

verifier /faults "" "" "" 0xa

드라이버 검증 도구 관리자 사용

  1. 드라이버 검증 도구 관리자를 시작합니다. 명령 프롬프트 창에 검증 도구를 입력합니다.

  2. 사용자 지정 설정 만들기(코드 개발자용)를 선택하고 다음을 클릭합니다.

  3. 전체 목록에서 개별 설정 선택을 선택합니다.

  4. 낮은 리소스 시뮬레이션을 선택하고 다음을 클릭합니다.

  5. 지연, 확률, 애플리케이션 및 풀 태그 속성에 대한 설정을 원하는 대로 변경합니다.

결과 보기

드라이버 검증 도구 오류 삽입 전역 카운터를 표시하여 드라이버 검증 도구가 의도적으로 리소스 할당에 실패하는 횟수를 모니터링할 수 있습니다 . 이 카운터는 드라이버 검증 도구가 마지막 부팅 이후 의도적으로 실패한 총 리소스 할당 수를 표시합니다.

드라이버 검증 도구 로그 파일(/log), 명령줄(/쿼리) 또는 드라이버 검증 도구 관리자에서 이 카운터를 볼 수 있습니다. Windows 2000에서 전역 카운터를 보려면 전역 카운터 탭을 선택합니다. 이후 버전의 Windows에서 현재 확인된 드라이버 작업에 대한 정보 표시를 선택한 다음 , 다음 을 두 번 누릅니다. 자세한 내용은 전역 카운터 모니터링을 참조하세요.

!verifier 디버거 확장을 사용하여 의도적으로 실패한 할당 수와 총 할당 수(확률 계산)를 표시할 수도 있습니다. 다음 예제에서는 !verifier 출력의 샘플을 보여줍니다.

이 예제에서 임의 낮은 리소스 API 오류 삽입은 낮은 리소스 시뮬레이션이 사용하도록 설정되어 있음을 나타냅니다. 리소스 할당 실패 는 의도적으로 실패한 할당 수를 나타내고 , 시도된 풀 할당 은 총 할당 수를 나타냅니다.

!verifier

Verify Level 5 ... enabled options are:
        Special pool
        Inject random low-resource API failures

Summary of All Verifier Statistics

RaiseIrqls                             0x2c671f
AcquireSpinLocks                       0xca1a02
Synch Executions                       0x10a623
Trims                                  0x0

Pool Allocations Attempted             0x862e0e
Pool Allocations Succeeded             0x8626e3
Pool Allocations Succeeded SpecialPool 0x768060
Pool Allocations With NO TAG           0x0
Pool Allocations Failed                0x34f
Resource Allocations Failed Deliberately   0x3f5

드라이버 검증 도구에서 가장 최근에 실패한 할당에 대한 스택 추적을 표시하려면 커널 디버거에서 !verifier 4 를 사용합니다.

다음 예제에서는 !verifier 4의 출력 샘플을 보여줍니다. 기본적으로 !verifier 4 는 가장 최근에 실패한 4개의 할당에서 스택 추적을 표시하지만 Quantity 매개 변수를 사용하여 표시되는 스택 추적 수를 늘릴 수 있습니다. 예를 들어 !verifier 0x80 가장 최근에 실패한 128개의 할당을 표시합니다.

이 예제에서는 검증 도구가 ExAllocatePoolWithTag에 대한 드라이버의 호출을 가로채서 대체했습니다. 드라이버 충돌의 가장 일반적인 원인 중 하나는 드라이버가 메모리 할당을 시도한 다음 할당 함수가 NULL이 아닌지 확인하기 전에 반환하는 포인터를 사용할 때 발생합니다.

kd> !verifier 4
Resource fault injection history:
Tracker @ 8354A000 (# entries: 80, size: 80, depth: 8)

Entry @ 8354B258 (index 75)

    Thread: C2638220

    816760CB nt!VerifierExAllocatePoolWithTag+0x49
    A4720443 win32k!bDeleteAllFlEntry+0x15d
    A4720AB0 win32k!GreEnableEUDC+0x70
    A47218FA win32k!CleanUpEUDC+0x37
    A473998E win32k!GdiMultiUserFontCleanup+0x5
    815AEACC nt!MiDereferenceSession+0x74
    8146D3B4 nt!MmCleanProcessAddressSpace+0x112
    815DF739 nt!PspExitThread+0x603

Entry @ 8354B230 (index 74)

    Thread: 8436D770

    816760CB nt!VerifierExAllocatePoolWithTag+0x49
    A462141C win32k!Win32AllocPool+0x13
    A4725F94 win32k!StubGdiAlloc+0x10

낮은 리소스 시뮬레이션 테스트를 통해 대부분의 드라이버 크래시가 가장 최근에 실패한 할당으로 인해 발생했음을 알 수 있습니다. 위의 예제에서 충돌은 win32k의 경로에 있었습니다! GreEnableEUDC. 할당 경로의 코드를 검사하여 크래시 원인을 찾습니다.

!verifier에 대한 자세한 내용은 Windows용 디버깅 도구 설명서를 참조하세요.

명령줄에서 레지스트리의 설정을 보려면 /querysettings 옵션을 사용합니다. 예:

C:\>verifier /querysettings
Special pool: Disabled
Pool tracking: Disabled
Force IRQL checking: Disabled
I/O verification: Disabled
Enhanced I/O verification: Disabled
Deadlock detection: Disabled
DMA checking: Disabled
Security checks: Disabled
Force pending I/O requests: Disabled
Low resources simulation: Enabled
IRP Logging: Disabled
Miscellaneous checks: Disabled

Low Resources Simulation options:

- Fault injection probability: 1/10000.
- Fail only allocations using pool tags: Tag1 Tag2.
- Simulate low resources conditions only in applications: test1.exe test2.exe.
- Boot time delay: 2 minutes.

Verified drivers:

blah.sys