AD+는 Debugging tools for windows에서 제공하는 Tool로써, Application의 Crash나 Hang 현상이 발생할 때, 쉽게 Memory Dump를 수집해 주는 Tool이다. 이는 실제 debugger는 아니고, adplus.vbs 라는 script file로써
A. Windows Script Host(WSH)를 이용하여 실제 debugger인 cdb.exe를 해당 Target에 쉽게 attach하고 Dump 를 수집할 수 있도록 도와주는 역할을 한다. 그러므로 WSH의 install은 필수다.
B. AD+는 Debugger가 attach 된 이후에 유용한 debugging 정보를 LOG file로써 남기며, 만일, 적절한 Symbol 이 존재한다면 유용한 정보로써 Log에 남겨진다,
C. Symbol Server나 Symbol path를 설정할 수 있도록 도와주며,
D. Dr, Watson 과는 다르게 1st chance exception에 대한 처리가 가능하도록 구성할 수 있다.
E. AD+, Debugging tools for windows도 마찮가지지만 XCOPY deployment가 가능하며, 또한
F. 반드시 Symbol이 있어야만 Dump를 수집할 수 있는 것은 아니다. 수집된 Dump를 분석할 때, 정확한 Debugging을 위해 Symbol을 맞춰서 분석하지만, 수집할 당시에는 Symbol이 존재하지 않더라도 Dump수집은 가능하다.
G. 기본적으로는 Debugging tools for windows 가 install된 Directory에 New directory를 생성하고, Dump 및 LOG file을 떨어뜨리며, 각 File의 Name은 Unique 하게 자동 설정되어 저장된다.
H. 그리고, 동시에 여러 Processes의 Dump 수집이나,
I. remote user에게 Notify 하는 것 등이 가능하다.
AD+는 다음의 경우에 유용하다.
1) 먼저, Process가 Deadlock 과 같은 Hang 상태 나,
2) CPU 100%인 Processes,
3) 그리고, 예기치 않게 종료되는 Processes 를 위해서 Memory Dump를 수집할 수 있다.
하지만, 다음과 같은 경우는 사용하지 않는다.
1) Startup시 예기치 않게 Process가 종료되는 경우나,
Note: 이 경우에는 Userdump.exe (http://www.microsoft.com/downloads/details.aspx?FamilyID=E089CA41-6A87-40C8-BF69-28AC08570B7E&displaylang=en)를 이용한다. 또는 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" key를 이용하여 CDB.exe난 Windbg.exe를 직접 Attach 하는 방법을 사용할 수 있다. (http://byung.egloos.com/3572751)그리고, AD+는 -sc option을 사용해서 process를 spawn 시켜 attach 할 수도 있다.
2) debug output나 EH(C++ Exception)이 대량으로 발생하는 경우, Performance의 이유로 권고하지 않는 다.
**
Full Dump ? Process에 대한 entire memory image를 포함하고 있다. 거의 Process가 사용하는 Memory와 size가 비슷하다. 그에 비해서 mini dump는 DLL과 EXE가 참조하고 있는 reference나 stacks 그리고 variables에 대한 정보만을 포함하기 때문에 size가 아주 작다.
** Options
일반적으로 command prompt 에서 다음과 같이 실행한다.
cscript adplus -hang -pn myapp.exe -quiet
AD+를 실행할 때 가능한 Options는 다음과 같다.
-hang | 특정 시점의 특정 process에 대한 Full memory dump를 수집한다. Terminal session에서도 가능하며, process를 terminated 하지 않는다. |
-crash | invalid handle/Illegal Instruction/Integer Divide by zero/Floating Point Divide by zero/integer overflow/Access Violation/Stack overflow/C++ EH Exeption/Unknown Exception 등의 Exceptions에 대해서 Dump를 수집할 수 있다. 이는 Hang option과 같이 사용할 수 없으며, Terminal Session에서 사용할 수 없다. 수집 시점에 Crash에 대한 정보를 Event log에 남기며, detach 시점에 Process가 terminated된다. |
-p <PID> | Task manager나 tlist.exe로 확인된 process id를 가지고 Target process를 설정한다. 하나 이상의 -p options을 사용하여 동시에 여러 proceses에 대한 Dump 수집이 가능하다. |
-pn <Process Name> | Process Name을 가지고 target process를 설정한다. -p options과 다중의 -pn options을 사용하여 동시에 여러 processes에 대한 Dump 수집이 가능하다. |
-iis | inetinfo 나 IIS worker process 및 dllhost.exe에 이르기 까지 monitoring 이 가능하다. 외에 추가적으로 -pn 이나 -p option을 추가할 수도 있다. |
-quiet | 모든 modal dialog popup을 suppress 한다. |
-o <output directory> | dump를 떨어뜨리는 output folder를 지정할 수 있다. |
-c <configfile.txt> | configuration file을 통해서 AD+를 설정할 수 있다. Note: Examples 첫 번째. Pageheap enabled 그리고, Crash Dump <ADPlus> <Settings> <RunMode> CRASH </RunMode> </Settings> <PostCommands> <Cmd> !gflag + htc </cmd> <Cmd> !gflag + hfc </cmd> <Cmd> !gflag + hpc </cmd> <Cmd> !gflag + hvc </cmd> <Cmd> !gflag + hpa </cmd> </PostCommands> <Exceptions> <!-- Configuring the AV exception --> <Config> <Code> av </Code> <Actions1> Log;Stack;FullDump;EventLog </Actions1> <ReturnAction1> GN </ReturnAction1> </Config> <!-- Configuring the Debug Break (CTL+C) exception --> <Config> <Code> bpe </Code> <Actions1> Log;Stack;FullDump;EventLog </Actions1> <ReturnAction1> GN </ReturnAction1> </Config> </Exceptions> </ADPlus> 두 번째. 일반적인 VB Runtime Error 의 경우 <ADPlus> <Settings> <RunMode> CRASH </RunMode> </Settings> <Exceptions> <NewException> <Code> c000008f </Code> <Name> VBError </Name> </NewException> <Config> <Code> c000008f </Code> <Actions1> Log;Stack;FullDump;EventLog </Actions1> </Config> </Exceptions> </ADPlus> 3번째. mdToken이 0x02000092인 특별한 CLR Exception에 대해서 Full Dump를 수집 <ADPlus> <Settings> <Sympath>srv*c:\symbols*http://msdl.microsoft.com/download/symbols</Sympath> </Settings> <Exceptions> <!-- Configuring the AV exception --> <Config> <Code> av </Code> <Actions1> Log;Stack </Actions1> <ReturnAction1> gn </ReturnAction1> </Config> <!-- This is for the CLR exception --> <Config> <Code> clr </Code> <Actions1> Log </Actions1> <ReturnAction1> gn </ReturnAction1> </Config> </Exceptions> <Breakpoints> <NewBP> <Address> mscorwks!RaiseTheException </Address> <CustomActions> j (poi(poi(poi(poi(esp+4))+8)+48) = 02000092)'.echo !!!!!!!!!!!!;du poi((poi(esp+4)+10))+c;.dump /ma /u OOM.dmp;kb;g' '.echo !!!!!!!!!!!!;du poi((poi(esp+4)+10))+c;.echo !!!!!!!!!!;kb;g '</CustomActions> <ReturnAction> </ReturnAction> </NewBP> </Breakpoints> </ADPlus> |
-y <symbol file path> | Symbol server나 Symbol File path를 지정할 수 있으며, ';'를 이용하여 각 path를 구분할 수 있다. (예를 들어, c:\path1;c:\path2 ) |
-notify <target> | NET SEND 를 이용하여 특정 User나 computer를 지정하여 notify 할 수 있다. |
-MiniOnSecond | 기본적으로 2nd Chance Exception은 Full Dump지만, Mini로 변경할 수 있다. |
-FullOnFirst | 기본적으로 1st Chance Exception은 Mini Dump지만, Full Dump로 변경할 수 있다. |
-NoDumpOnFirst | 동일한 1st Chance Exception이 많이 발생할 때, dump File을 overwrite 하도록 설정한다. 예를 들어, C++ EH Exceptions의 경우 유용할 수 있다. |
-NoDumpOnSecond | 2nd Chance Exceptions을 Disable 한다. |
-CTCF | CTRL+C 를 눌렀을 때 Full Dump를 생성하도록 하고, exit 된다. Note: 100% CPU로 인하여 Command 입력이 어려워 Hang Dump 수집이 불가능하다면, 미리 Crash Mode로 -CTCF option을 가지고 수행하도록 하고, CPU 100시점에 CTRL+C를 눌러서 Dump를 수집할 수 있도록 할 수 있다. |
-CTCFG | CTRL+C를 눌렀을 때 Full Dump를 생성하도록 하고, App는 계속 실행된다. |