애플리케이션 검증 도구 - 애플리케이션 테스트

AppVerifier(Application Verifier)는 일반적인 애플리케이션 테스트 기술로 식별하기 어려울 수 있는 미묘한 프로그래밍 오류, 보안 문제 및 제한된 사용자 계정 권한 문제를 찾는 데 도움이 되는 관리되지 않는 코드에 대한 런타임 확인 도구입니다.

신뢰할 수 있는 Windows 애플리케이션을 제공하려면 다음을 수행합니다.

  1. 고객에게 릴리스하기 전에 디버거 아래 및 전체 페이지 힙에서 Application Verifier를 사용하여 관리되지 않는(네이티브) 코드로 작성된 애플리케이션을 테스트합니다.
  2. 애플리케이션 검증 도구에서 제공하는 단계에 따라 잘못된 조건을 resolve.
  3. 애플리케이션이 릴리스되면 수집된 애플리케이션 실패 보고서를 정기적으로 모니터링합니다(예: 사용 가능한 경우 Windows 오류 보고).

스레드 풀 검사는 기본적으로 "기본 사항" 검사 제목에서 사용하도록 설정됩니다. 기본 설정에 포함되므로 사용자는 이러한 검사 및 기타 중요한 검사를 활용하기 위해 기본 설정을 사용하여 코드에서 애플리케이션 검증 도구만 실행하면됩니다.

애플리케이션 검증 도구 구성

디버거 설정

확인 중인 애플리케이션은 사용자 모드 디버거에서 실행되어야 합니다. 그렇지 않으면 오류가 발생할 때 디버거에 침입하므로 시스템은 커널 디버거에서 실행되어야 합니다. 자세한 디버거 세부 정보는 애플리케이션 검증 도구 - 디버깅 애플리케이션 검증 도구 중지 를 참조하세요.

설정

실행 중인 프로세스에 대해 Application Verifier를 사용하도록 설정할 수 없습니다. 따라서 아래에 설명된 대로 설정을 지정한 다음 애플리케이션을 시작해야 합니다. 설정은 명시적으로 삭제될 때까지 지속됩니다. 따라서 애플리케이션을 시작한 횟수에 관계없이 설정이 삭제될 때까지 AppVerifier를 사용하도록 설정하여 시작합니다.

Application Verifier 기본 사항 테스트 사용

아래 시나리오에서는 권장되는 명령줄 및 사용자 인터페이스 옵션을 보여 줍니다. 전체 검사를 보장하기 위해 코드를 연습하는 모든 테스트 중에 실행해야 합니다. 이러한 시나리오에 대한 기대는 애플리케이션이 디버거에 침입하지 않고 AppVerifier를 사용하지 않고 실행될 때와 동일한 통과 속도로 모든 테스트를 통과한다는 것입니다.

를 사용하여 테스트하려는 애플리케이션에 대해 검증 도구를 사용하도록 설정합니다. 명령줄에서: appverif /verify MyApp.exe.

사용자 인터페이스에서: 애플리케이션 영역 내에서 마우스 오른쪽 단추를 클릭하고 애플리케이션 추가를 선택하여 애플리케이션을 추가합니다. 테스트 영역에서 기본 사항을 선택합니다. 저장 단추를 클릭합니다.

참고:

/verify는 기본 테스트를 사용하도록 설정합니다.

DLL을 테스트하는 경우 DLL을 실행하는 테스트 실행 파일에 대해 애플리케이션 검증 도구를 사용하도록 설정해야 합니다.

확인 계층을 별도로 실행합니다. 예를 들어 한 세션에서는 모든 기본 사항을 사용하도록 설정하고 다른 세션에서는 모든 LuaPriv 검사를 사용하도록 설정합니다.

애플리케이션을 실행하는 모든 테스트를 실행합니다.

발생한 디버거 중단을 분석합니다. 중단이 발생하는 경우 이를 이해하고 수정해야 합니다. 참고: 도움말 콘텐츠는 휴식 시간 및 조사 방법에 대한 세부 정보를 제공합니다.

완료되면 모든 설정을 삭제합니다. 명령줄에서: appverif /n MyApp.exe.

사용자 인터페이스에서 애플리케이션 영역 내에서 마우스 오른쪽 단추를 클릭하고 애플리케이션 삭제를 선택하여 애플리케이션을 제거합니다. 그런 다음 저장 단추를 클릭합니다.

힙 손상

Windows 시스템에서 애플리케이션 충돌의 거의 10%가 힙 손상으로 인해 발생합니다. 이러한 충돌은 사실 이후에 디버그하는 것이 거의 불가능합니다. 이러한 문제를 방지하는 가장 좋은 방법은 애플리케이션 검증 도구에 있는 페이지 힙 기능을 사용하여 테스트하는 것입니다. 페이지 힙에는 "Full"과 "Light"의 두 가지 버전이 있습니다. Full이 기본값입니다. 손상이 감지되면 디버거가 즉시 중지됩니다. 이 기능은 디버거 아래에 있는 동안 실행해야 합니다. 그러나 가장 까다로운 리소스이기도 합니다. 사용자가 타이밍 문제가 있고 이미 "전체" 페이지 힙에서 시나리오를 실행한 경우 이를 "밝게"으로 설정하면 이러한 문제가 해결될 수 있습니다. 또한 프로세스가 종료될 때까지 라이트 페이지 힙이 충돌하지 않습니다. 할당에 대한 스택 추적을 제공하지만 전체 대응 항목을 활용하는 것보다 진단하는 데 훨씬 더 오래 걸릴 수 있습니다.

AppVerifier 낮은 리소스 시뮬레이션 사용(오류 주입)

이 시나리오에 대한 기대는 애플리케이션이 디버거에 침입하지 않는다는 것입니다. 디버거에 침입하지 않으면 해결해야 하는 오류가 없음을 의미합니다.

무작위 오류 주입이 정상 작업에 도입되기 때문에 테스트의 통과 속도가 크게 감소할 수 있습니다.

애플리케이션에 대해 애플리케이션 검증 도구 낮은 리소스 시뮬레이션(오류 주입)을 사용하도록 설정합니다. 명령줄에서: Appverif /verify MyApp.exe /faults. 사용자 인터페이스에서: 애플리케이션 영역 내에서 마우스 오른쪽 단추를 클릭하고 애플리케이션 추가 를 선택하여 애플리케이션을 추가합니다. 테스트 영역에서 낮은 리소스 시뮬레이션을 선택합니다. 저장 단추를 클릭합니다.

참고: DLL을 테스트하는 경우 전체 프로세스 대신 특정 DLL에 낮은 리소스 시뮬레이션(오류 주입)을 적용할 수 있습니다. 명령줄 형식은 다음과 같습니다.

appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]

예제:

appverif /verify mytest.exe /faults 50000 1000 d3d9.dll

애플리케이션을 실행하는 모든 테스트 실행

발생한 디버거 중단을 분석합니다. 중단이 발생하는 경우 이를 이해하고 수정해야 합니다.

완료되면 모든 설정을 삭제합니다. 명령줄에서 appverif /n MyApp.exe. 사용자 인터페이스에서: 애플리케이션 영역 내에서 마우스 오른쪽 단추를 클릭하고 애플리케이션 삭제를 선택하여 저장 단추를 클릭하여 애플리케이션을 제거합니다.

참고: 장애 주입을 사용 및 사용하지 않고 실행하면 애플리케이션의 코드 경로가 크게 다르므로 AppVerifier의 모든 이점을 얻으려면 두 시나리오를 모두 실행해야 합니다.

WOW64에서 애플리케이션 검증 도구 사용

32비트 또는 64비트 버전의 Application Verifier를 사용하여 WOW64에서 실행되는 32비트 애플리케이션을 확인할 수 있습니다.

AppVerifier 데이터 분석

AppVerifier 분석 중에 생성된 모든 데이터는 %USERPROFILE%\AppVerifierLogs 폴더에 이진 형식으로 저장됩니다. 그런 다음 추가 분석을 위해 사용자 인터페이스 또는 명령줄을 통해 이러한 로그를 XML로 변환할 수 있습니다.

XML 파일을 보려면 Microsoft Excel로 가져오기 - XML 파일을 Excel로 가져오기 및 필터 또는 피벗 테이블을 사용하여 수집된 데이터를 다시 구성하고 분석하는 등의 도구를 사용하여 XML을 볼 수 있습니다.

명령줄 사용

애플리케이션 검증 도구는 UI를 통해 또는 명령줄 옵션을 사용하여 사용할 수 있습니다.

다음은 명령줄을 사용하는 방법의 예입니다(아래는 세부 정보).

appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]

appverif /verify notepad

appverif -enable LAYER … -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …] 

appverif -disable LAYER ... -for TARGET ...

appverif -query LAYER ... -for TARGET ...

appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]

appverif –logtofile {enable|disable}

두 애플리케이션에 대해 특정 확인 계층에 대해 Application Verifier를 사용하도록 설정하려면 다음을 수행합니다.

appverif –enable Heaps Locks –for notepad.exe iexplore.exe

X.DebugLevel 및 Y.DebugLevel 속성을 사용하여 대상 test.exe 대해 X 및 Y라는 두 계층을 사용하도록 설정하려면 다음을 수행합니다.

appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2

모든 검사를 사용하지 않도록 설정하려면 애플리케이션에서 실행됩니다.

appverif -disable * -for notepad.exe

또는

appverif -delete settings -for notepad.exe

모든 프로세스에 대해 애플리케이션 검증 도구 로깅을 전역적으로 사용하거나 사용하지 않도록 설정하려면 다음을 수행합니다.

appverif –logtofile enable

appverif –logtofile disable

로깅은 모든 프로세스에 대해 기본적으로 사용하도록 설정됩니다.

Application Verifier 명령줄 구문

애플리케이션 검증 도구 명령줄 사용:

-enable TEST ... -for TARGET ... [-with [TEST.]PROPERTY=VALUE ...]
-disable TEST ... -for TARGET ...
-query TEST ... -for TARGET ...
-configure STOP ... -for TARGET ... -with PROPERTY=VALUE...
-verify TARGET [-faults [PROBABILITY [TIMEOUT [DLL ...]]]]
-export log -for TARGET -with To=XML_FILE [Symbols=SYMBOL_PATH] [StampFrom=LOG_STAMP] [StampTo=LOG_STAMP] [Log=RELATIVE_TO_LAST_INDEX]
-delete {logs|settings} -for TARGET ...
-stamp log -for TARGET -with Stamp=LOG_STAMP [Log=RELATIVE_TO_LAST_INDEX]
-logtoxml LOGFILE XMLFILE
-installprovider PROVIDERBINARY
-sppath [PROTECTED_PROCESS_LOG_PATH]
-cppath
-logtofile [enable | disable]

명령줄 구문은 하나 이상의 레이어를 허용하고 계층에 대한 선택적 속성 지정자를 사용하여 하나 이상의 대상에 적용합니다.

appverif -enable LAYER ... -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …] appverif -disable LAYER ... -for TARGET ... appverif -query LAYER ... -for TARGET ... appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]

여기서

LAYER는 확인 계층의 표준 이름입니다. 새 검증 도구 공급자가 설치된 경우 명령줄에서 사용할 새 확인 계층 이름이 표시됩니다. 계층 예는 힙, 핸들 또는 잠금입니다.

LAYER를 *로 설정하여 명령이 모든 계층에 적용되도록 지정할 수 있습니다.

TARGET은 이진 이름(예: notepad.exe)입니다. 이는 레지스트리에 유지되는 정적 설정이며 애플리케이션이 시작될 때마다 고려됩니다. appverif –disable 명령의 경우 TARGET을 *로 설정하여 모든 대상을 사용하지 않도록 지정할 수 있습니다.

PROPERTY는 명령줄에 언급된 LAYER와 관련된 속성 이름입니다. 예를 들어 Handles 계층에는 추적이 속성으로 있습니다.

VALUE는 속성의 값입니다. 값의 형식은 속성과 연결된 형식에 따라 달라지고 적용됩니다. 현재 지원되는 형식은 부울(true/false), 정수(C 표기법의 10진수/8진수/16진수), 문자열 및 다중 문자열(\0\0'을 \0’ between strings and being terminated by 포함)입니다. VALUE를 지정하지 않으면 사용자가 해당 속성을 삭제하고 속성의 기본값으로 동작을 되돌리기 것을 의미합니다.

STOP은 구성할 검증 도구 중지 문제의 수(C 표기법의 10진수 또는 16진수)입니다. 중지 코드는 고유해야 합니다(두 계층이 동일한 중지 코드를 사용할 수 없으므로 도구 자체에서 중지가 속한 계층을 결정합니다).

STOPPROPERTY는 검증 도구 중지에 허용되는 속성 이름입니다. 값을 지정하지 않으면 속성을 삭제해야 한다고 가정합니다. 중지에 허용되는 속성은 다음과 같습니다(자세한 내용은 아래 검증 도구 중지 구성 참조).

  • ErrorReport
  • 심각도

속성은 필요에 따라 해당 속성이 속한 계층에 의해 정규화될 수 있습니다. 그러나 명령줄에서 하나의 레이어만 사용하도록 설정하는 경우에는 이 작업이 필요하지 않습니다. 예를 들어 X.DebugLevel 및 Y.DebugLevel 속성이 있는 대상 test.exe 대해 X 및 Y라는 두 계층을 사용하도록 설정하려면 명령은 다음과 같습니다.

appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2

그러나 계층 X를 사용하는 경우 정규화되지 않은 속성 이름을 사용할 수 있습니다.

appverif –enable X –for test.exe –with DebugLevel=1

속성 이름과 값 사이의 구분 기호 문자는 (등호) 또는 : (콜론)일 수 있습니다 = .

기타 명령

appverif –query providers

appverif –delete logs –for TARGET ...

appverif –delete settings –for TARGET ...

레지스트리에서 대상을 완전히 초기화합니다.

appverif –stamp log –for Target –with Stamp=”LOG_STAMP”[Log= RELATIVE_TO_LAST_INDEX]

이 명령은 로그에 LOG_STAMP 스탬프합니다. 이 스탬프는 XML 형식으로 로그를 볼 때 관련 로그의 섹션만 식별하는 데 유용합니다.

appverif –export log –for TARGET –with To=XML_FILE[Symbols=SYMBOL_PATH][Stamp=LOG_STAMP][StampTo=LOG_STAMP][Log=RELATIVE_TO_LAST_INDEX]

위의 명령은 이진 로그를 xml 파일로 내보냅니다. 선택적 Stamp 속성은 로그의 어느 부분을 XML로 내보내야 하는지 식별하는 데 사용됩니다. 지정하지 않으면 전체 로그가 변환됩니다. Log 속성은 가능한 값으로 음수 정수이며 마지막 값부터 변환해야 하는 로그 파일을 나타냅니다(속성이 없는 경우 가정). 예를 들어 notepad.exe 세 번 연속으로 시작합니다. 만든 첫 번째 로그에 액세스하려면 명령줄에서 Log=-2를 지정합니다.

명령줄의 바로 가기 키

바로 가기는 다음과 같습니다.

appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]

여기서

TARGET은 위에서 설명한 것과 동일한 의미를 가짐

PROBABILITY는 오류를 삽입할 확률입니다. 0..1000000 범위의 값이어야 합니다. 지정하지 않으면 기본값은 5%입니다.

TIMEOUT은 오류 주입이 발생하지 않는 프로세스 시작 시 시간 간격(밀리초)입니다. 이 작업은 오류가 발생하기 전에 프로세스가 제대로 시작되도록 하기 위해 수행됩니다. 지정하지 않으면 값이 500msecs입니다.

DLL은 프로세스에 로드되는 모듈의 이름입니다. 일반적으로 동적 라이브러리(확장 .dll)의 이름이지만 ActiveX(확장 .ocx) 또는 다른 로드 가능한 모듈일 수 있습니다.

예:

appverif /verify notepad.exe /faults 100000 1000 msvcrt.dll

notepad.exe 대해 오류 주입을 사용하도록 설정합니다(시작할 때마다). 오류는 확률이 10%이고 프로세스가 시작된 후 1,000msecs만 발생하며 msvcrt.dll 시작된 작업에 대해서만 발생합니다.

오류 주입 세부 정보 사용

/faults 명령줄을 사용하면 OLE_ALLOC 및 HEAP_ALLOC 대한 오류 주입만 사용할 수 있습니다. 그러나 명령줄을 사용하여 켜려는 오류 주입 유형을 구성할 수 있습니다. 예를 들어 레지스트리 또는 파일 API에 오류를 2%로 삽입하려면 명령줄을 사용합니다.

appverif -enable lowres -for hello.exe -with registry=20000 file=20000

다음은 또 다른 예제입니다.

appverif -query lowres -for hello.exe

Settings for hello.exe:
Test [lowres] enabled.

Include = *
Exclude =
TimeOut = 2000 (0x7D0)
WAIT = 0 (0x0)
HEAP_ALLOC = 20000 (0x4E20)
VIRTUAL_ALLOC = 0 (0x0)
REGISTRY = 20000 (0x4E20)
FILE = 20000 (0x4E20)
EVENT = 0 (0x0)
MAP_VIEW = 0 (0x0)
OLE_ALLOC = 20000 (0x4E20)
STACKS = false

검증 도구 중지 구성

명령줄(또는 사용자 인터페이스)을 사용하여 검증 도구 중지를 구성할 수 있습니다. 활용할 예는 다음과 같습니다.

Appverif -configure STOP ... -for TARGET ... -with PROPERTY=VALUE ...

STOP은 0x200 0x201 같은 중지 코드입니다.

TARGET은 foo.exe 같은 애플리케이션 이름입니다.

PROPERTY는 "ErrorReport", "심각도" 및 "Flavor" 중 하나일 수 있습니다.

ErrorReport의 경우 VALUE는 다음 값의 조합일 수 있습니다.

0x00000001 중지가 활성 상태임을 의미합니다. (이 비트가 0이면 중지가 비활성화됨을 의미합니다.)

0x00000020 중단점을 사용하여 중지가 디버거로 중단되는 것을 의미합니다.

0x00000040 검증 도구 예외를 생성하여 중지가 디버거로 중단됨을 의미합니다.

0x00000080 중지가 로그 파일에 기록됨을 의미합니다.

0x00000100 이 중지에 대한 스택 추적이 로그 파일에 기록됨을 의미합니다.

심각도의 경우 VALUE는 다음 중 하나일 수 있습니다.

0x00000003 정보 중지.

0x0000000F 경고입니다.

0x0000003F 오류입니다.

Flavor의 경우 Value는 다음 값의 조합일 수 있습니다.

0x00000002 중지할 수 없습니다.

0x00000010 이 중지는 한 번만 표시됩니다. 테스트 실행 내에서 다음 번에 무시됩니다.

예를 들어 중지 0x2700 사용하지 않도록 설정하고 foo.exe 0x2701.

Appverif –configure 0x2700 0x2701 –for foo.exe –with ErrorReport=0

중지 코드 0x2700 디버거에 침입(기본적으로 해제됨) 구성하고, 스택 추적 없이 로그를 저장하고, 계속 불가능하게 만듭니다.

Appverif –configure 0x2700 –for foo.exe –with ErrorReport=0xA1 Flavor=0x2

검증 도구 중지 옵션 - 고급 설정

Application Verifier에는 검증 도구 중지당 변경할 수 있는 비활성과 같은 고급 설정이 있습니다.

액세스 검증 도구 중지 옵션 - 사용 가능한 옵션을 나열하는 대화 상자에서 검증 도구 중지 옵션이 변경됩니다. 검증 도구 중지 옵션에 액세스하려면 다음을 수행합니다.

  1. 테스트 창에서 테스트 이름을 선택합니다.
  2. 편집 메뉴에서 검증 도구 중지 옵션을 선택하거나 테스트를 마우스 오른쪽 단추로 클릭하고 검증 도구 중지 옵션을 선택합니다.

검증 도구 중지 옵션

중지 코드를 클릭하여 나열된 검증 도구 중지당 다음 요소를 변경할 수 있습니다(클릭할 때 중지에 대한 설명이 표시됨).

비활성 은 선택한 경우 검증 도구 중지 코드가 실행되지 않도록 비활성화하는 확인란입니다.

심각도는 검증 도구 중지에 플래그를 지정하는 방법을 결정합니다.

  • 무시
  • 정보
  • 경고
  • Error

오류 보고는 특정 검증 도구 중지를 보고/기록하는 방법을 결정합니다.

파일에 로그 - 선택한 경우 지정된 파일에 로그하는 확인란입니다.

로그 스택 추적 - 선택할 때 사용할 수 있을 때 스택 추적을 기록하는 확인란입니다.

중단 없음 - 디버거에서 중단하지 않는 옵션입니다.

예외 - 중단점 및 중단점이 없는 옵션

중단점 - 중단 또는 예외가 없는 옵션입니다.

기타는 두 가지 옵션을 제공합니다.

한 번 중지 - 선택한 경우 애플리케이션을 테스트할 때 해당 오류에서 한 번만 중지되는 확인란입니다.

계속 가능하지 않음 - 선택하면 조사 없이 계속 진행할 수 없는 확인란입니다.

참고 항목

애플리케이션 검증 도구 - 개요

애플리케이션 검증 도구 - 기능

애플리케이션 검증 도구 - 애플리케이션 검증 도구 내의 테스트

애플리케이션 검증 도구 - 코드 및 정의 중지

애플리케이션 검증 도구 - 애플리케이션 검증 도구 디버깅 중지

애플리케이션 검증 도구 - 질문과 대답