2018년 3월 20일 화요일

Application Verifier 사용하기

2010. 8. 3. 12:52


Application Verifier 사용하기

l  Win 32 일 경우 다운로드는 아래 사이트에서 x86버전으로 받을 것.
l  대략적인 사용법은 http://blog.naver.com/titerced/100045103644 참고 바람.

Application Verifier(이하 AV) MS에서 배포하는 실행 파일 검증 도구로서 Access Violation , Hangs, Lock 오류, Handle 손실, Memory 침범 또는 삭제오류(중복삭제삭제한 곳을 사용) 등의 오류를 사전에 검출할 수 있는 도구로 유용하다.
때문에 실행파일의 배포 전에 이 도구를 이용해서 여러 가지 테스트를 하는 것이 꼭 필요하다고 생각을 한다.
테스트라고 해서 특별한 것은 없고 실행파일을 AV에 등록해서 계속 돌려 보기만 하면 된다.

아래 오류 발생코드를 보자메모리 침범의 간단한 예제이다. )

char * pTemp = NULL;
pTemp = new char[10];
memset(pTemp,0,100);
메모리를 10 바이트 할당하고 100바이트를 초기화 시켰다.
명백한 메모리 침범 예인데 , 이 경우 release 에서는 경우에 따라서 죽을 수도 있고 , 안 죽을 수도 있다위 코드로 보면 매우 간단한 경우지만 이런 유사한 오류가 실제로 초보자에게는 많이 발생한다.

아래는 AV에서 logs를 보면 나오는 내용이다.
<avrf:logEntry Time="2010-07-21 : 14:21:05" LayerName="Heaps" StopCode="0x13" Severity="Error">
<avrf:message>First chance access violation for current stack trace.</avrf:message>
<avrf:parameter1>37d7000 - Invalid address causing the exception.</avrf:parameter1>
<avrf:parameter2>411a90 - Code address executing the invalid access.</avrf:parameter2>
<avrf:parameter3>13fbf0 - Exception record.</avrf:parameter3>
<avrf:parameter4>13fc0c - Context record.</avrf:parameter4>
위 내용을 보면 오류코드에 대한 내용과 , EIP(411a90)정보를 확인할 수 있다.
411a90 내용을 확인해서 소스가 어디인지 알려면 Crash Finder를 사용하면 된다물론 PDB,MAP이 있다는 가정에서 이다.
Crash Finder 작업이 조금 귀찮다면 WinDbg를 사용하면 된다.


주의 : Application Verifier을 사용하게 되면 메모리 할당을 Release지만 Debug모드처럼 Memory Guard Block을 할당하고 , 메모리 침범 등 여러 가지 오류를 검출하는 동작을 하기 때문에 실제보다 많이 느리기 작동하게 된다때문에 절대 Real환경에서는 사용해서는 안 된다.
참고로 이전의 UMDH 예제 코드의 경우 아래와 같이 많은 양이 메모리가 할당 되는 것을 볼 수 있다.
+      10 (   4718 -   4708)      5 allocs  BackTrace5AD
+       1 (      5 -      4)         BackTrace5AD    allocations

ntdll!RtlAllocateHeap+00000E9F
vfbasics!AVrfpRtlAllocateHeap+000000E0
(e:\verifier\source\base\avrf\avrf30\providers\basics\heap.c, 233)
Timetest!_heap_alloc+00000044 (f:\vs70builds\3077\vc\crtbld\crt\src\malloc.c, 211)
kernel32!BaseProcessStart+00000023

Total increase ==     10 requested +   8182 overhead =   8192
또한 소스코드의 위치도 AV관련된 내용으로 변경 되었음을 알 수 있다.

l  사실 위와 같은 이유로 인해 AV를 이용해 대용량 서버의 오류를 찾으려고 할 때는 한계가 있다너무 많은 메모리사용과실행 속도의 감소가 있기 때문에 정상적인 작동을 보증하기 어려울 때가 많기 때문이다.
이 경우에는 WinDbg를 사용하면 된다.

주의 2 : Application Verifier을 사용하다 셋팅을 해지 할 때는 꼭 해당 exe파일의 등록을 지우고 하단의 ‘Save’ 버튼을 이용해 환경 저장을 한번 더 해줘야 한다.
Application Verifier에서 등록은 프로그램의 종료로 없어지는 것이 아니고 시스템에 남아 있기 때문에 , 반드시 삭제를 통해서 등록을 해지해야 한다.

댓글 없음:

댓글 쓰기