개발된 프로그램이 Release되어 고객이나 일반 사용자에게 배포되어 사용하게 되면 정말 예상치 못한 일들이 상당히 발
생하게 된다.
그 중 랜덤하게 개발된 프로그램이 소리소문 없이 죽어버리는(?) 문제에 대해 최소한의 해결 실마리를 찾을 수 있는
방법에 대해 공유하고자 한다.
해당 문제가 재현이 잘되는 경우라면 당현이 개발자 PC에서 디버깅을 통해 문제를 찾고 수정할 수 있으나, 이러한 문제
들은 대부분 개발자 PC에서 잘 재현되지 않으며, 사용자 PC에서도 간혈적으로 발생하는 문제라면 더욱더 문제처리를
하기가 어려워진다.
로그를 통해 문제를 추적해 볼 수 있으나 이 또한 애매한 경우가 상당수다..
물론 Release하는 프로그램이라면 당연히 프로그램내에 mini-dump정도는 생성하는 로직이 필수로 들어가 있을것이라
고 판단되어 진다.
하지만 이렇게 랜덤하게 죽는(Crash) 프로그램인 경우는 dump가 생성되지 않고 죽는 경우가 상당 수 있다.
이런 경우 경험이 있거나 초짜가 아닌이상 windbg의 adplus를 이용해서 dump를 수집하려는 분도 있을것이다.
뭐 당연한 얘기지만...하지만 내가 경험해보았을대 windbg의 adplus를 사용하면 해당 target program에 attach하기 때문
에 프로그램의 속도가 상당히 저하되고, 이 또한 100% 덤프가 남지 않는 Case도 있었다.
그래서 ProcDump.exe라는 프로그램을 이용하여 난 dump없는 죽는 프로그램에 대해 dump를 수집하고 분석할 수 있었
다..(속도 저하 부분은 있는지는 정확히는 모르겠다.)
하여 ProcDump를 사용하여 dump를 수집하는 방법을 공유해보도록 한다.
ProcDump 사용하는 방법
1. Download Link
-> 아래 링크에 접속하여 ProcDump를 다운받는다.(아니면 구글에 ProcDump검색)
docs.microsoft.com/en-us/sysinternals/downloads/procdump
2. 압축 해제 및 명령어 실행
다운로드 받은 폴더를 압축을 해제하면 아래와 같이 파일들이 있는데
64bit 프로세스인 경우에는 마치 procdump64 가 붙은 프로그램을 사용해야 할 거 같은데
그냥 procdump.exe를 사용하면 된다.
웹서핑을 해서 찾아본봐보를 해당 exe에 64도 들어있기 때문에 알아서 해주는거 같다.
자 이제 압축을 해제 하였으니 cmd창을 열어 procdump.exe 에 적당한 인자를 넣어 실행하여 본다.
여기서 dump를 남기고자 하는 OS가 UAC(사용자 계정 컨트롤) 이 활성화 되어 있다면 cmd(명령 프롬프트 창)은
관리자 권한으로 실행시켜 진행한다.
만약 win 10인 경우에는 윈도우 검색에 명령이라고 검색하여 아래 명령 프롬프트를 관리자 권한으로 실행한다.
그 다음에 예를들어 dump를 수집해야 하는 프로세스명이 calc.exe라면(윈도우 계산기) 아래와 같은
명령어를 입력한다.
단 위 명령어를 수행하기 전에 반드시 Dump를 수집할 프로세스는 구동중인 상태이어야 한다.
최초 구동시에는 아래와 같이 라이선스 알림창이 뜨는데 Agree 해줘서 넘어가자.
그러면 이제 아래와 같이 모니터링을 하고 있는 내용의 출력된다.
이 상태에서 대상 프로그램이 Crash나 기타이유에서 죽어버리면 아래 처럼 짜자잔~~
위와 같이 procdump 실행파일 위치에 덤프가 생성된 모습을 볼 수 있다.
추가적인 명령어 관련해서는 아래와 같다.
(docs.microsoft.com/en-us/sysinternals/downloads/procdump 발취함)
Using ProcDump
Capture Usage:
cmdCopy
procdump.exe [-mm] [-ma] [-mp] [-mc Mask] [-md Callback_DLL] [-mk] [-n Count] [-s Seconds] [-c|-cl CPU_Usage [-u]] [-m|-ml Commit_Usage] [-p|-pl Counter_Threshold] [-h] [-e [1 [-g] [-b]]] [-l] [-t] [-f Include_Filter, ...] [-fx Exclude_Filter, ...] [-o] [-r [1..5] [-a]] [-at Timeout] [-wer] [-64] { {{[-w] Process_Name | Service_Name | PID} [Dump_File | Dump_Folder]} | {-x Dump_Folder Image_File [Argument, ...]} }
Install Usage:
cmdCopy
procdump.exe -i [Dump_Folder] [-mm] [-ma] [-mp] [-mc Mask] [-md Callback_DLL] [-mk] [-r] [-at Timeout] [-k] [-wer]
Uninstall Usage:
cmdCopy
procdump.exe -u
TABLE 1ParameterDescription-a | Avoid outage. Requires -r. If the trigger will cause the target to suspend for a prolonged time due to an exceeded concurrent dump limit, the trigger will be skipped. |
-at | Avoid outage at Timeout. Cancel the trigger's collection at N seconds. |
-b | Treat debug breakpoints as exceptions (otherwise ignore them). |
-c | CPU threshold at which to create a dump of the process. |
-cl | CPU threshold below which to create a dump of the process. |
-d | Invoke the minidump callback routine named MiniDumpCallbackRoutine of the specified DLL. |
-e | Write a dump when the process encounters an unhandled exception. Include the 1 to create dump on first chance exceptions. |
-f | Filter the first chance exceptions. Wildcards (*) are supported. To just display the names without dumping, use a blank ("") filter. |
-fx | Filter (exclude) on the content of exceptions and debug logging. Wildcards are supported. |
-g | Run as a native debugger in a managed process (no interop). |
-h | Write dump if process has a hung window (does not respond to window messages for at least 5 seconds). |
-i | Install ProcDump as the AeDebug postmortem debugger. Only -ma, -mp, -d and -r are supported as additional options. |
-k | Kill the process after cloning (-r), or at the end of dump collection |
-l | Display the debug logging of the process. |
-m | Memory commit threshold in MB at which to create a dump. |
-ma | Write a dump file with all process memory. The default dump format only includes thread and handle information. |
-mc | Write a custom dump file. Include memory defined by the specified MINIDUMP_TYPE mask (Hex). |
-md | Write a Callback dump file. Include memory defined by the MiniDumpWriteDump callback routine named MiniDumpCallbackRoutine of the specified DLL. |
-mk | Also write a Kernel dump file. Includes the kernel stacks of the threads in the process. OS doesn't support a kernel dump (-mk) when using a clone (-r). When using multiple dump sizes, a kernel dump is taken for each dump size. |
-ml | Trigger when memory commit drops below specified MB value. |
-mm | Write a mini dump file (default). |
-mp | Write a dump file with thread and handle information, and all read/write process memory. To minimize dump size, memory areas larger than 512MB are searched for, and if found, the largest area is excluded. A memory area is the collection of same sized memory allocation areas. The removal of this (cache) memory reduces Exchange and SQL Server dumps by over 90%. |
-n | Number of dumps to write before exiting. |
-o | Overwrite an existing dump file. |
-p | Trigger on the specified performance counter when the threshold is exceeded. Note: to specify a process counter when there are multiple instances of the process running, use the process ID with the following syntax: "\Process(<name>_<pid>)\counter" |
-pl | Trigger when performance counter falls below the specified value. |
-r | Dump using a clone. Concurrent limit is optional (default 1, max 5). CAUTION: a high concurrency value may impact system performance. - Windows 7 : Uses Reflection. OS doesn't support -e. - Windows 8.0 : Uses Reflection. OS doesn't support -e. - Windows 8.1+: Uses PSS. All trigger types are supported. |
-s | Consecutive seconds before dump is written (default is 10). |
-t | Write a dump when the process terminates. |
-u | Treat CPU usage relative to a single core (used with -c). As the only option, Uninstalls ProcDump as the postmortem debugger. |
-w | Wait for the specified process to launch if it's not running. |
-wer | Queue the (largest) dump to Windows Error Reporting. |
-x | Launch the specified image with optional arguments. If it is a Store Application or Package, ProcDump will start on the next activation (only). |
-64 | By default ProcDump will capture a 32-bit dump of a 32-bit process when running on 64-bit Windows. This option overrides to create a 64-bit dump. Only use for WOW64 subsystem debugging. |
-? | Use -? -e to see example command lines. |
If you omit the dump file name, it defaults to <processname>_<datetime>.dmp.
Use the -accepteula command line option to automatically accept the Sysinternals license agreement.
Automated Termination:
Setting an event with name "ProcDump-<PID>" is the same as typing Ctrl+C to gracefully terminate ProcDump
Filename:
Default dump filename: PROCESSNAME_YYMMDD_HHMMSS.dmp
The following substitutions are supported:
PROCESSNAME Process Name
Process ID PID
EXCEPTIONCODE Exception Code
YYMMDD Year/Month/Day
HHMMSS Hour/Minute/Second
Examples
Write a mini dump of a process named 'notepad' (only one match can exist):
C:\>procdump notepad
Write a full dump of a process with PID '4572':
C:\>procdump -ma 4572
Write 3 mini dumps 5 seconds apart of a process named 'notepad':
C:\>procdump -s 5 -n 3 notepad
Write up to 3 mini dumps of a process named 'consume' when it exceeds 20% CPU usage for five seconds:
C:\>procdump -c 20 -s 5 -n 3 consume
Write a mini dump for a process named 'hang.exe' when one of it's Windows is unresponsive for more than 5 seconds:
C:\>procdump -h hang.exe hungwindow.dmp
Write a mini dump of a process named 'outlook' when total system CPU usage exceeds 20% for 10 seconds:
C:\>procdump outlook -p "\Processor(_Total)\% Processor Time" 20
Write a full dump of a process named 'outlook' when Outlook's handle count exceeds 10,000:
C:\>procdump -ma outlook -p "\Process(Outlook)\Handle Count" 10000
Write a MiniPlus dump of the Microsoft Exchange Information Store when it has an unhandled exception:
C:\>procdump -mp -e store.exe
Display without writing a dump, the exception codes/names of w3wp.exe:
C:\>procdump -e 1 -f "" w3wp.exe
Write a mini dump of w3wp.exe if an exception's code/name contains 'NotFound':
C:\>procdump -e 1 -f NotFound w3wp.exe
Launch a process and then monitor it for exceptions:
C:\>procdump -e 1 -f "" -x c:\dumps consume.exe
Register for launch, and attempt to activate, a modern 'application'. A new ProcDump instance will start when it activated to monitor for exceptions:
C:\>procdump -e 1 -f "" -x c:\dumpsMicrosoft.BingMaps_8wekyb3d8bbwe!AppexMaps
Register for launch of a modern 'package'. A new ProcDump instance will start when it is (manually) activated to monitor for exceptions:
C:\>procdump -e 1 -f "" -x c:\dumps Microsoft.BingMaps_1.2.0.136_x64__8wekyb3d8bbwe
Register as the Just-in-Time (AeDebug) debugger. Makes full dumps in c:\dumps:
C:\>procdump -ma -i c:\dumps
See a list of example command lines (the examples are listed above):
C:\>procdump -? -e
위와 같은 방법으로 Dump 없이 죽는 프로그램에 대해 mini dump를 수집하여 문제가 발생되는 부분에 대해
분석하고 처리가 가능할 것이다!
- 정보는 공유되어야 한다 쭈욱~
'Study > Debugging' 카테고리의 다른 글
Visual studio - 조건 브레이크를 통한 디버깅 (0) | 2020.04.21 |
---|---|
Windbg 원격 디버깅 방법 (0) | 2014.11.03 |
소프트웨어 브레이크 포인터와 하드웨어 브레이크 포인터 (0) | 2011.09.28 |
WinDbg로 PEB 보기^^ (0) | 2011.09.28 |
- 프로세스 시작시 자동 디버깅 - (0) | 2011.09.28 |
댓글