Q1) 특정 메모리 값이 덥어 쒸어졌다. 어떻게 확인 할것인가???
0. 반복문 안에서 발생하느가?
- 반복문의 횟수가 세팅하려는 배열보다 더 많이 도는가??
1. 필요기술
1) gdb 사용기술
(1) 메모리 상태 검사 (x)
a. x/x
b. x/[범위][출력 형식][범위의 단위] : 메모리의 특정 범위의 값들을 확인할 수 있다.
가. 범위 : 출력할 갯수
나. 출력 형식 :
- t(2진수)
- o(8진수)
- d(부호 있는 10진수)
- u(부호없는 10진수)
- x(hex)
- c(최초 1바티으 값을 문자형으로 출력)
- f(부동소수점 형시으로 출력)
- a(가장 가까운 심볼의 오프셋을 출려)
- s(문자열로 출력)
- i(어셈블리로 출력)
다. 범위 단위 :
- b(1 byte 단위(byte))
- h(2 byte 단위(halfword)
- w(4 byte 단위(word)
- g(8 byte 단위(giant word)
(2) 변수 변경 탐지 기술
a. watch 변수명
가. ex) (gdb) watch test // test 값이 변경될 때마다 브레이크가 걸린다
(3) 메모리 번지수 조정 방법(메모리 주소 사용과 변수 사용의차이점)
a. x/x 특정 메모리번지수 - 1
가. 특정 메모리에서 -1 byte 전의 메모리 값을 본다.
나. ex)
---- 소스 -----
static int a=111111;
static int b=222222;
---- gdb -----
(gdb) p &b
$3 = (int *) 0x60103c <b.2181>
(gdb) x/10bx 0x60103c
0x60103c <b.2181>: 0x0e 0x64 0x03 0x00 0x00 0x00 0x00 0x00
0x601044 <e.2184+4>: 0x80 0x20
(gdb) x/10bx 0x60103c + 0x1 <= 1byte만 이동됨)
0x60103d <b.2181+1>: 0x64 0x03 0x00 0x00 0x00 0x00 0x00 0x80
0x601045 <e.2184+5>: 0x20 0xeb
b. x/x 특정 변수 - 1
가. 해당 변수의 -1 index 값 메로리 값을 본다.(배열처림 처리된다)
나. ex)
나. ex)
---- 소스 -----
static int a=111111;
static int b=222222;
---- gdb -----
(gdb) x/10bx &b
0x60103c <b.2181>: 0x0e 0x64 0x03 0x00 0x00 0x00 0x00 0x00
0x601044 <e.2184+4>: 0x80 0x20
(gdb) x/10bx &b -1 <==4 byte만큼 이동됨
0x601038 <a.2180>: 0x07 0xb2 0x01 0x00 0x0e 0x64 0x03 0x00
0x601040 <e.2184>: 0x00 0x00
(gdb) x/10bx &a <변수 b의 4바이트전은 a이므로 이를 확인
0x601038 <a.2180>: 0x07 0xb2 0x01 0x00 0x0e 0x64 0x03 0x00
0x601040 <e.2184>: 0x00 0x00
2.응용
1). watch로 변경되는 변수를 잡는다.
2). 해당 값이 변경되면 어느 라인에서 변견되는지가 출력된다.
3). 변경된 라인의 변수의 메모리 정보를 참조하여 어떤 변수를 쓰는 관정에서 변경되었는지 유추한다