[windbg] 3차 세미나 ppt - 유저모드 디버깅 케이스_

Download Report

Transcript [windbg] 3차 세미나 ppt - 유저모드 디버깅 케이스_

유저모드 디버깅 케이스
20th 김현철
GJSSM
1
잘못된 메모리 사용
• 할당된 메모리의 길이보다 긴 길이의 문자열을 복사
해 문제가 발생하는 경우
Char* pszString;
pszString = (CHAR*)malloc(strlen(“sometext”));
strcpy(pszString, “sometext”);
• 뒷부분의 메모리를 망가뜨리고 뒷부분을 다른 포인터
나 버퍼가 사용 중이라면 잠재적인 문제를 발생
GJSSM
2
잘못된 메모리 사용
• 해제된 메모리 사용
Struct SomeStructWhichNotInitialized {
PVOID MemoryBuffer;
};
Void CLabAppDlg::OnFreedheapaccessBtn() {
SomeStructWhichNotInitialized* pInitializedStruct =
(SomeStructWhichNotInitialized*)malloc
(sizeof(SomeStructWhichNotInitialize));
Free(pInitializedStruct);
}
pInitializedStruct->MemoryBuffer = (PVOID)0xffffffff;
GJSSM
3
잘못된 메모리 사용
• WinDbg 안에 Gflags 도구를 사용하여 잘못된
메모리 사용 문제(언더플로우, 오버플로우, 해제메모리 재사용)
찾을 수 있음
• Gflags 시작
GJSSM
4
잘못된 메모리 사용
• Gflag 옵션 설정
– Enable Page Heap 옵션(오버플로우, 해제 메모리 사용 감지)
GJSSM
5
잘못된 메모리 사용
• 해제된 메모리 사용 예제
1. 해제된 메모리 사용(오류가
발생하지 않음 확인)
2. Gflags를 실행시켜 예제프로그램 LabApp.exe을
등록하고 Enable page heap을 체크
3. 또는명령창에 gflags –I LabApp.exe +hpa 입력
4. 다시 LabApp를 실행해 해제된 메모리를 사용하면
전과 달리 오류를 발생시키며 종료
GJSSM
6
잘못된 메모리 사용
• 오류 발생시 생성된 메모리 덤프 확인
– 0173aff8 주소의 메모리를 읽으려다 참조
오류가 발생하여 비정상 종료 확인
– 심볼을 설정하면 소스라인 확인가능(명령어 lsa)
GJSSM
7
메모리 누수
1. 작업 관리자로 누수 확인
1) 작업관리자 [보기]->[열선택]->[메모리-커밋 크기]
(비스타 이전에는 [vm 크기])
-> ‘메모리 사용’ : 작업 집합 크기,
즉 해당 프로세스가 사용하는
물리 메모모리의 양
-> 그러므로 메모리 확인을 위해서
커밋 크기를 확인해야 함
GJSSM
8
메모리 누수
2. 성능 모니터로 누수 확인
1) 오랜 시간 동안 조금씩 메모리 누수가 발생하고 있
으며 원인을 찾지 못했을 때 사용
2) 성능 모니터에서 [Process] 성능 개체의 [Private
Bytes]를 모든 프로세스에 설정해 특정 프로세스에
서 메모리 사용량이 계속 증가되고 있는지 확인
3) 단점 : 어떤 소스코드나 어떤 콜 스택을 통해서 메
모리가 할당되는지 확인할 수 없음
GJSSM
9
메모리 누수
3. UMDH(User Mode Dump Heap tool)로 확인
1) WinDbg 안에 UMDH 툴을 이용하여 가상 메모리 확인
2) 예제 LabApp.exe를 실행하여 메모리 누수 확인
①
명령 창에서 Gflags를 실행해 유저 모드 스택 추정을 설정
GJSSM
10
메모리 누수
② 시스템 환경 변수에 심볼 경로를 설정
③ LabApp.exe를 실행시킨 후 작업관리자에서 프로세스
ID 확인
④ Umdh를 실행
⑤ LabApp에서 Memory leak을 몇 번 누른 후 명령 실행
⑥ 두개의 정보 사이 차이점을 확인하기 위한 명령을 아래
와 같이 실행
GJSSM
11
메모리 누수
GJSSM
12
Question
GJSSM
13