2018년 3월 20일 화요일

Windbg 에서 메모리 관련 문제 찾기

2010. 8. 3. 12:55


다음의 내용은 Quad Dimensions에서 Debugging 교육 자료로 만든 내용입니다.
본부장
가져 가실때는 이 정보 남겨 주시는것이 예의 겠지요 ^^



 

Windbg 에서 메모리 관련 문제 찾기

l  Memory 정보 기호 설명

Microsoft Visual C++ Runtime Library (DEBUG_NEW가 선언된 상태)
(1) 0XCD, 0xCDCD, 0xCDCDCDCD
   - 
초기화 되지 않은 heap 메모리
   - malloc() 또는 new로 객체가 생성되고 아직 Write한 적이 없는 상태
(2) 0xFD, 0xFDFD, 0xFDFDFDFD
   - "No man's land" , 
메모리 경계검사를 위해 삽입됨
(3) 0xDD, 0xDDDD, 0xDDDDDDDD
   - free() 
또는 delete로 객체를 Free한 상태

Compiler Initialization
(1) 0xCC, 0xCCCC, 0xCCCCCCCC
   - 
초기화 되지 않은 스택 메모리
   - VC++에서 /GZ옵션을 넣어 컴파일하는 경우에만 적용됨

Windows NT 
계열의 Memory Codes
(1) 0xABABABAB
   - LocalAlloc()
함수에 의해 할당된 메모리 블럭
(2) 0xBAADF00D
   - "Bad Food" , LocalAlloc(LMEM_FIXED, ...)
를 통해 할당된 메모리 블럭이지만
아직 Write한 적이 없는 상태
(3) 0xFEEEFEEE
   - HeapAlloc() 
또는 LocalAlloc()함수에 의해 할당될 예정인 메모리
   - HeapFree()
함수를 통해 이미 Free된 상태

l  디버그시에 메모리 블록 다이어그램
자세한 내용은 http://byunhy69.blog.me/140075010891 참조

다음의 도표는 디버그 상에서 메모리를 8 bytes 할당 할 때 실제로 메모리가 할당되는 내용을 보여주는 것이다.
HeapAlloc(), malloc() 를 했을 때와 free(), HeapFree() 했을 때 어떻게 다른지 보여준다실제 메모리 바로 바깥쪽으로Guard Memory가 할당되는 것을 볼 수 있다.

 




Address
Offset
After HeapAlloc()
After malloc()
During free()
After HeapFree()
Comments
0x00320FD8
-40
0x01090009
0x01090009
0x01090009
0x0109005A
Win32 heap info
0x00320FDC
-36
0x01090009
0x00180700
0x01090009
0x00180400
Win32 heap info
0x00320FE0
-32
0xBAADF00D
0x00320798
0xDDDDDDDD
0x00320448
Ptr to next CRT heap block (allocated earlier in time)
0x00320FE4
-28
0xBAADF00D
0x00000000
0xDDDDDDDD
0x00320448
Ptr to prev CRT heap block (allocated later in time)
0x00320FE8
-24
0xBAADF00D
0x00000000
0xDDDDDDDD
0xFEEEFEEE
Filename of malloc() call
0x00320FEC
-20
0xBAADF00D
0x00000000
0xDDDDDDDD
0xFEEEFEEE
Line number of malloc() call
0x00320FF0
-16
0xBAADF00D
0x00000008
0xDDDDDDDD
0xFEEEFEEE
Number of bytes to malloc()
0x00320FF4
-12
0xBAADF00D
0x00000001
0xDDDDDDDD
0xFEEEFEEE
Type (0=Freed, 1=Normal, 2=CRT use, etc)
0x00320FF8
-8
0xBAADF00D
0x00000031
0xDDDDDDDD
0xFEEEFEEE
Request #, increases from 0
0x00320FFC
-4
0xBAADF00D
0xFDFDFDFD
0xDDDDDDDD
0xFEEEFEEE
No mans land
0x00321000
+0
0xBAADF00D
0xCDCDCDCD
0xDDDDDDDD
0xFEEEFEEE
The 8 bytes you wanted
0x00321004
+4
0xBAADF00D
0xCDCDCDCD
0xDDDDDDDD
0xFEEEFEEE
The 8 bytes you wanted
0x00321008
+8
0xBAADF00D
0xFDFDFDFD
0xDDDDDDDD
0xFEEEFEEE
No mans land
0x0032100C
+12
0xBAADF00D
0xBAADF00D
0xDDDDDDDD
0xFEEEFEEE
Win32 heap allocations are rounded up to 16 bytes
0x00321010
+16
0xABABABAB
0xABABABAB
0xABABABAB
0xFEEEFEEE
Win32 heap bookkeeping
0x00321014
+20
0xABABABAB
0xABABABAB
0xABABABAB
0xFEEEFEEE
Win32 heap bookkeeping
0x00321018
+24
0x00000010
0x00000010
0x00000010
0xFEEEFEEE
Win32 heap bookkeeping
0x0032101C
+28
0x00000000
0x00000000
0x00000000
0xFEEEFEEE
Win32 heap bookkeeping
0x00321020
+32
0x00090051
0x00090051
0x00090051
0xFEEEFEEE
Win32 heap bookkeeping
0x00321024
+36
0xFEEE0400
0xFEEE0400
0xFEEE0400
0xFEEEFEEE
Win32 heap bookkeeping
0x00321028
+40
0x00320400
0x00320400
0x00320400
0xFEEEFEEE
Win32 heap bookkeeping
0x0032102C
+44
0x00320400
0x00320400
0x00320400
0xFEEEFEEE
Win32 heap bookkeeping

댓글 없음:

댓글 쓰기