2010. 8. 3. 12:55
다음의 내용은 Quad Dimensions에서 Debugging 교육 자료로 만든 내용입니다.
본부장
가져 가실때는 이 정보 남겨 주시는것이 예의 겠지요 ^^
Windbg 에서 메모리 관련 문제 찾기
|
l Memory 정보 기호 설명
Microsoft Visual C++ Runtime Library (DEBUG_NEW가 선언된 상태)
(1) 0XCD, 0xCDCD, 0xCDCDCDCD
- 초기화 되지 않은 heap 메모리
(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
- 초기화 되지 않은 스택 메모리
(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, ...)를 통해 할당된 메모리 블럭이지만
Windows NT 계열의 Memory Codes
(1) 0xABABABAB
- LocalAlloc()함수에 의해 할당된 메모리 블럭
(2) 0xBAADF00D
- "Bad Food" , LocalAlloc(LMEM_FIXED, ...)를 통해 할당된 메모리 블럭이지만
아직 Write한 적이 없는 상태
(3) 0xFEEEFEEE
- HeapAlloc() 또는 LocalAlloc()함수에 의해 할당될 예정인 메모리
- HeapFree()함수를 통해 이미 Free된 상태
(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
|
댓글 없음:
댓글 쓰기