반응형

Windbg로 분석할 수 있도록 덤프 파일을 생성해 보자.

 

디버깅 정보 쓰기 - '커널/전체 메모리 덤프'가 선택되어 있어야 한다.

 

NotMyFault.zip
1.40MB

위 파일을 다운로드하고 압축을 풀어준다.

 

컴퓨터 환경에 맞는 파일을 실행한다.

 

크래시 발생 옵션을 선택하고 Crash 버튼을 클릭한다.

Crash 버튼을 클릭하면 블루 스크린이 나타나고 재부팅 되니 열려있는 작업은 모두 종료한다.

 

메모리 덤프가 생성된다.

 

※ 참고

Generate a kernel or complete crash dump

 

반응형
Posted by J-sean
:
반응형

도스박스에 디버거를 붙여 실행해 보자.

 

일반적으로 도스박스를 실행하면 위 메인 창이 표시된다.

 

dosbox-74-3-debug.zip
1.52MB

위 파일을 다운 받고 압축을 풀어 도스박스가 설치된 폴더에 저장한다. (도스박스 버전은 0.74-3이다)

 

저장한 파일을 실행하면 위와 같이 레지스터, 데이터, 코드 등이 표시되는 디버거 창이 함께 나타난다.

명령어를 실습해 보자. 디버거가 아닌 도스박스 메인 창에서 Alt+Pause키를 누른다. 디버거가 활성화 되면 아래 명령을 입력한다.

memdump 0000:0010 20

 

Output/Input 창 아래에 Memory dump success 메세지가 표시된다.

 

MEMDUMP.TXT 파일이 생성된다.

 

0000:0010 부터 0x20 바이트의 메모리가 덤프되었다.

 

※ 참고

Understanding the DOSBox debug screen

Guide to the DOSBox debugger

 

반응형
Posted by J-sean
:
반응형

동적으로 할당한 힙 메모리의 누수를 탐지해 보자.

 

_NT_SYMBOL_PATH에 심볼 경로를 설정한다.

 

gflags를 실행한다.

/i: Image file settings

+ust: Creates a run-time stack trace database in the address space of a particular process (image file mode) or all processes (system-wide). (Create user mode stack trace database flag)

 

gflags.zip
0.06MB

 

메모리 누수가 의심되는 프로그램을 실행한다.

 

실행한 프로그램의 PID를 확인한다. (10368)

 

 

메모리 누수가 의심되는 동작 전 umdh를 실행해 메모리 덤프(dump1.dmp)를 만든다.

-p: specify the PID
-f: specify the name and location of the output file for the heap dump

 

umdh.zip
0.04MB

 

메모리 누수를 일으키는 동작을 실행한다. (8회)

 

다시 umdh를 실행해 메모리 덤프(dump2.dmp)를 만든다.

 

두 덤프 파일의 차이를 diff.txt 파일로 보낸다.

 

 

diff.txt 파일을 확인한다.

8회의 동작으로 320바이트의 메모리가 할당되고 해제되지 않았음을 확인 할 수 있다. 메모리 누수로 의심되는 코드는 CLabAppDlg 클래스의 OnMemoryleakBtn 함수다.

 

반응형
Posted by J-sean
:
반응형

파일이나 폴더를 삭제하려고 할 때 아래와 같이 'XXX에서 열려 있어 작업을 완료 할 수 없다'는 메세지가 나오는 경우가 있다.

파일이 사용 중이기 때문에 삭제할 수 없다.

물론 이런 경우 대부분 엑셀을 종료하면 간단히 해결 할 수 있지만 간혹 엑셀이 종료되었는데도 파일을 삭제할 수 없는 상황이 발생하기도 한다. 파일(폴더)의 핸들을 어디선가 다른 프로세스가 잡고 있기 때문이다.

 

간단히 비슷한 상황을 만들어 해결책을 알아보자.

 

삭제하고 싶은 폴더(Target)를 만들고 안에 파일 하나를 생성한다.

 

생성된 파일을 열어준다.

 

폴더(Target) 삭제를 시도한다. 폴더 내 파일이 사용 중이기 때문에 실패한다.

물론 우리는 메모장(notepad)이 파일을 잡고 있다는걸 알지만 여기서는 메모장의 상황은 모르는걸로 가정하자.

 

 

어떤 프로그램이 폴더(Target)를 사용 하는지 알아내기 위해 프로세스 익스플로러를 실행하고 Find - Find Handle or DLL...을 선택한다.

 

찾고 싶은 이름(target)을 입력하고 Search 버튼을 클릭한다.

'target' 문자열이 들어가는 이름의 핸들을 잡고 있는 프로세스를 모두 찾아준다. 위 예에선 우리가 삭제하고자 하는 'G:\Test\Target'을 notepad.exe 프로세스가 잡고 있는걸 확인 할 수 있다. 클릭한다.

 

notepad.exe 프로세스가 소유한 파일 핸들 중 'G:\Test\Target'이 있다.

어떤 프로세스가 핸들을 잡고 있는지 알아냈으므로 그 프로세스를 종료시키거나 다른 작업을 통해 핸들을 반환하도록 할 수 있다.

 

※ 참고

Process Explorer

 

반응형
Posted by J-sean
:
반응형

프로그램의 어떤 함수가 컴퓨터 CPU 자원을 독점하는지 찾아보자.

 

프로세스 익스플로러를 실행한다.

 

Options - Configure Symbols... 를 선택한다.

 

Dbghelp.dll 경로와 분석할 프로그램 Symbols 경로를 지정한다.

 

CPU 자원을 많이 소비하고 있는 프로세스를 찾는다.

 

 

우클릭 - Properties... 를 선택한다.

 

Threads 탭을 선택하고 CPU를 많이 사용하는 스레드를 찾아 선택하고 Stack 버튼을 클릭한다.

 

ThreadFunc2 함수가 실행되고 있음을 확인한다.

 

ThreadFunc2()

 

반응형
Posted by J-sean
:
반응형

유저 모드 애플리케이션이 충돌한 후 덤프를 수집하고 저장하도록 해 보자.

 

위와 같이 레지스트리 값을 작성한다. DumpType 만 작성하고 나머지는 기본값을 사용했다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

Value Description Type Default value
DumpFolder 덤프 파일을 저장할 경로 REG_EXPAND_SZ %LOCALAPPDATA%\CrashDumps
DumpCount 폴더의 최대 덤프 파일 수 REG_DWORD 10
DumpType 다음 덤프 유형 중 하나
0: 사용자 지정 덤프
1: 미니 덤프
2: 전체 덤프
REG_DWORD 1
CustomDumpFlags 사용할 사용자 지정 덤프 옵션. 이 값은 DumpType 이 0으로 설정된 경우에만 사용. REG_DWORD  

 

애플리케이션이 충돌하면 덤프 파일이 생성된다.

 

※ 참고

Collecting User-mode dumps

 

반응형
Posted by J-sean
:
반응형

x32/x64 디버거에서 심볼파일(pdb)을 불러오자.

 

디버깅할 프로세스를 불러온다.

 

심볼파일을 불러온다.

symload module_name, path

 

심볼파일이 존재하면 완료 메세지가 뜬다.

 

심볼 윈도우에서 모듈을 선택하고 심볼을 확인한다.

만약 프로그램 파일이 존재하는 디렉토리에 심볼파일이 같이 존재하면 자동으로 로드된다.

 

※ 참고

symload/loadsym

symunload/unloadsym

 

반응형
Posted by J-sean
:
반응형

WinDbg 메모리 윈도우에서 변수를 확인해 보자.

 

g_dwGlobal 변수는 0x00007FF6DC7FE000 번지 메모리에 0x5678 값을 가지고 있다.

 

메모리 윈도우에서 변수명으로 확인해 보자.

Address 박스에 변수명(MyApp!g_dwGlobal)을 입력하면 변수값(0x5678)이 주소로 인식된다.

 

변수명 앞에 주소 연산자(&)를 붙이자.

주소 연산자(&)를 붙이면 변수 주소가 주소로 인식된다.

 

반응형
Posted by J-sean
: