버그 잡이/GDB 활용

gdb 디버깅) 특정 메모리 값이 덥어 쒸어졌다. 어떻게 확인 할것인가?

jinkwon.kim 2017. 8. 10. 11:54
728x90
반응형


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). 변경된 라인의 변수의 메모리 정보를 참조하여 어떤 변수를 쓰는 관정에서 변경되었는지 유추한다


   


 

   


728x90
반응형