시작하자마자 비정상 종료하는 프로세스의 메모리 덤프 - procdump
예전 글에서,
windbg - 분석 예: 시작하자마자 비정상 종료하는 프로세스 - NullReferenceException
; https://www.sysnet.pe.kr/2/0/996
풀 덤프 파일을 남기는 방법
; https://www.sysnet.pe.kr/2/0/991
procdump를 소개하면서 시작하자마자 비정상 종료하는 경우 "procdump -ma -t -w test.exe"라는 식의 방법을 소개해 드렸는데 더 쉬운 방법이 있습니다. 그냥 procdump에 -i 옵션을 주면 되는데,
C:\Windows\System32> procdump -i
ProcDump v9.0 - Sysinternals process dump utility
Copyright (C) 2009-2017 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com
Set to:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
(REG_SZ) Auto = 1
(REG_SZ) Debugger = "c:\tools\procdump.exe" -accepteula -j "C:\Windows\System32" %ld %ld %p
Set to:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
(REG_SZ) Auto = 1
(REG_SZ) Debugger = "c:\tools\procdump.exe" -accepteula -j "C:\Windows\System32" %ld %ld %p
단지, 기본 폴더가 "C:\Windows\System32"라는 것이 경우에 따라 문제가 됩니다. 왜냐하면 관리자 권한의 프로세스 실행이 아니라면 저 폴더에 접근이 안 되므로 덤프 뜨는 동작에서 다음과 같이 예외가 발생하기 때문입니다.
Error creating dump file:
Access is denied. (0x80070005, -2147024891)
C:\Windows\System32\ConsoleApplication1.exe_191114_101239*
[10:12:39] Dump 1 initiated: C:\Windows\System32\ConsoleApplication1.exe_191114_101239*
[10:12:39] Dump 1 error: Error writing dump file: 0x80070006
The handle is invalid. (0x80070006, -2147024890)
그래서 기본적으로는 -i 옵션 사용 시 덤프 남길 폴더 경로(와 full dump를 위한 -ma 옵션)를 습관적으로 함께 지정하는 것이 좋습니다.
procdump -i c:\temp -ma
이제 남은 작업은, 비정상 종료하는 프로그램을 실행시키는 것으로 끝!
마지막으로 다시 해제하는 방법은 "-u" 옵션으로 실행합니다. ^^
C:\Windows\System32> procdump -u
ProcDump v9.0 - Sysinternals process dump utility
Copyright (C) 2009-2017 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com
Reset to:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
(REG_SZ) Auto = <deleted>
(REG_SZ) Debugger = "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld
Reset to:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
(REG_SZ) Auto = <deleted>
(REG_SZ) Debugger = "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld
ProcDump is no longer the Just-in-time (AeDebug) debugger.
참고로, procdump가 복원하는 vsjitdebugger.exe는 비주얼 스튜디오가 설치된 컴퓨터에서 설정된 값이고 기본적으로는 비어 있습니다.
sysinternals 관련 도구를 실행할 때 이런 오류가 발생한다면?
procdump.exe - Bad Image
C:\SysInternals\pdh.dll is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support. Error status 0xc000012f.
원인은, pdh.dll 파일이 너무 예전 것이기 때문입니다. 기본적으로 최신 pdh.dll 파일이 윈도우에 포함되어 있기 때문에 해당 폴더(C:\SysInternals)에 있는 pdh.dll을 지워도 무방합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]