본문 바로가기
Study/Debugging

Crash 발생 프로그램의 dump 생성 방법(Dump없이 죽는 프로그램도 해당) - procdump 사용

by 뿡뿡대마왕 2021. 1. 5.
반응형

개발된 프로그램이 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

Download Page

 

2. 압축 해제 및 명령어 실행

 

  다운로드 받은 폴더를 압축을 해제하면 아래와 같이 파일들이 있는데

압축 해제 후 파일들

   64bit 프로세스인 경우에는 마치 procdump64 가 붙은 프로그램을 사용해야 할 거 같은데

   그냥 procdump.exe를 사용하면 된다.

   

   웹서핑을 해서 찾아본봐보를 해당 exe에 64도 들어있기 때문에 알아서 해주는거 같다.

 

   자 이제 압축을 해제 하였으니 cmd창을 열어 procdump.exe 에 적당한 인자를 넣어 실행하여 본다.

   

 

cmd창 실행하기

   

  

 여기서 dump를 남기고자 하는 OS가 UAC(사용자 계정 컨트롤) 이 활성화 되어 있다면 cmd(명령 프롬프트 창)은

  

 관리자 권한으로 실행시켜 진행한다.

 

Win 7인경우

 

만약 win 10인 경우에는 윈도우 검색에 명령이라고 검색하여 아래 명령 프롬프트를 관리자 권한으로 실행한다.

 

 그 다음에 예를들어 dump를 수집해야 하는 프로세스명이 calc.exe라면(윈도우 계산기) 아래와 같은

 

 명령어를 입력한다.

 

 단 위 명령어를 수행하기 전에 반드시 Dump를 수집할 프로세스는 구동중인 상태이어야 한다.

 

 최초 구동시에는 아래와 같이 라이선스 알림창이 뜨는데 Agree 해줘서 넘어가자.

 

그러면 이제 아래와 같이 모니터링을 하고 있는 내용의 출력된다.

명령어를 수행한 모습

 

 이 상태에서 대상 프로그램이 Crash나 기타이유에서 죽어버리면 아래 처럼 짜자잔~~

Dump가 생성된 모습

 

위와 같이 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를 수집하여 문제가 발생되는 부분에 대해

 

분석하고 처리가 가능할 것이다!

 

 - 정보는 공유되어야 한다 쭈욱~ 

반응형

댓글