http://sweeper.egloos.com/2456134





간혹 서버 Live 서비스를 하다보면, 덤프를 남기지 못하는 경우가 있다.
대부분 CRT가 유저모드 SEH 이전에 익셉션을 먹어버리는 경우와 콜 스택 오버 플로우의 경우였다.
장애가 발생하였지만 덤프가 남지 않으면 사실상 해당 문제는 해결하기 어려워진다.

지난 4월에도 AdPlus를 써보고 테스트 해봤지만, 이번 기회에 다시 한번 정리하고자 한다.

============================================================================

AdPlus는 다음 URL에서 정보를 획득할 수 있다. http://support.microsoft.com/kb/286350


AdPlus 설치

1. Debugging Tools for Windows 최신 버전을 설치한다.
2. Windows symbol package를 설치한다. 
   : http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx#f
   : 위 사이트에서 OS 버전별로 심폴 패키지 다운로드를 할 수 있다.
3. Symbol package 설치가 완료되면, System path에 다음과 같이 등록한다.
   : _NT_SYMBOM_PATH
   : 값은 symbol package가 설치된 폴더 (ex. C:\Windows\Symbols\)


AdPlus 사용법

AdPlus는 process hang 또는 crash에 대해 탐지, 덤프를 남길 수 있다.
사용할 수 있는 기능은 http://support.microsoft.com/kb/286350 에 잘 정리되어 있다.

AdPlus는 확장자가 vbs이다. 단독 실행이 안되니 CScript를 사용해서 하여야 한다.
귀찮으니까 batch 파일로 만들어주던지 하자.

예제)
AdPlus.bat
CScript "C:\Program Files\Debugging Tools for Windows (x86)\adplus.vbs" -hang -pn GameServer.exe -o "d:\BEAM\Server\GameServer\"

(참고로, 감지하고자 하는 프로세스는 AdPlus를 실행하기 전에 먼저 실행되고 있어야 한다)
위 예제는 hang 감지이고 -hang 대신 -crash를 사용하면 크래쉬에 대한 탐지가 시작된다.
정상적으로 debugger가 attach 될 경우 아래 그림처럼 된다.

이 후 프로세스가 크래쉬되면 덤프가 output dir로 지정한 폴더에 덤프가 생성된다.


AdPlus 사용 소감

기본적인 SEH Set(try-except + minidump + stackwalk)을 사용할 때, worker thread에서 
콜스택 오버플로우 발생시 익셉션 핸들러로 들어오지 조차 못하고 
너무 조용하게 서버가 죽어버렸는데, AdPlus는 이놈을 잡아내었다.

안정적인 서버 예외 증거를 포착하기 위해서 충분히 필요한 존재라고 판단된다.