반응형

실행중인 프로그램이 특정 조건을 만족하면 메모리 덤프 파일을 생성하도록 해 보자.

 

문제가 있는(메모리 덤프를 생성할) 프로그램을 미리 실행시킨다.

 

Procdump.zip
0.70MB

위 파일을 다운로드하고 압축을 푼다.

 

ProcDump 폴더로 이동한다.

 

'procdump 프로세스명' 으로 실행하면 바로 미니 덤프를 생성한다.

 

 

미니 덤프가 생성되었다.

 

'-ma -c 20 -s 5' 옵션을 주고 실행한다.

-ma: 전체 덤프 생성

-c: 덤프 생성 CPU 사용율 임계값

-s: 덤프 생성 조건 연속 시간

= CPU 사용율이 20%이상으로 5초 지속되면 전체 덤프 파일을 생성한다.

 

CPU 사용률이 20%를 넘기자 카운트가 시작되고 5초 후 전체 덤프 파일이 생성된다.

 

전체 덤프 파일이 생성되었다.

 

 

덤프 파일을 분석하면 어디서 문제가 발생하는지 파악할 수 있다.

 

이번엔 '-ma -t' 옵션으로 실행한다.

-t: 프로세스가 종료되면 덤프 파일을 생성한다. (크래시 발생으로 비정상 종료되어도 덤프 파일 생성)

 

프로세스가 종료되자 전체 덤프 파일이 생성된다.

 

전체 덤프 파일이 생성되었다.

 

※ 참고

ProcDump

 

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

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

 

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

 

NotMyFault.zip
1.40MB

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

 

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

 

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

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

 

메모리 덤프가 생성된다.

 

※ 참고

Generate a kernel or complete crash dump

 

반응형
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
:
반응형

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

 

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

 

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

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

 

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

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

 

반응형
Posted by J-sean
: