Programming/Linux(Unix)

(7/31) GNU Debugger(GDB)

부풍 2009. 7. 31. 16:45


 인텔은 oxcc코드를 cpu가 처리하게 되면 익셉션 인터럽트(브레이크 포인트) 발생

대부분의 CPU가 디버깅 기법 제공.

디버거는 기본적으로 프로그램을 실행시켜서 디버그,
디버거로 제어권이 넘어오면
-각종 상태(메모리, 변수, 레지스터등) 알 수 있다.
-특정 변수의 값을 바꿀수 있다. (ex) i가 100인데 200으로 진행시켜보면 어떤값이 나올까?)
-흐름을 바꿀수 있다.

highlevel 디버깅시
 gcc -g filename ( C Source File 들을 가지고 있어야 함. 변경, 삭제하면 안됨 )

$gdb
$gdb (binary name)
$gdb () core  => core dump file (비정상종류시 메모리에 있는거 뱉은거)
$gdb () 1234 


프로그램이 argument받는프로그램이면
gdb ./프로그램
실행후, prompt에서
gdb)set args -l /bin  (여서 넣어주면 됨)        또는  gdb)run -l /bin


gdb)list     => 소스 내용 보여줌.  내용이 길면 엔터로 넘어가며 볼수 있음
gdb)list 4,10  => 4~10번줄 보기

gdb)break (함수이름)      
      break  (줄번호)
-binary가 여러파일로 구성되있는 경우에.. => ex)a.c b.c ......  =>  break  b.c:10   (b.c의 10번째줄)
-제거시에는 gdb)disable (브레이크포인터번호)    => 정보는 남아있다.    
           so   gdb)enable (번호) 를 통해 재활성화 가능
- gdb)delete를 통해 브레이크포인터를 삭제 가능.

gdb)info b       =>  break 정보보기
      info local   =>  현재위치에서 정보들 보기 (각종 변수값들등)
      info reg     =>  register 값보기
    
 -asem단위 break걸기
gdb)break *(주소)
      disassemble (함수이름)  => 함수의 어셈 쭉 출력

gdb) next     or       n                     gdb)  step
함수호출경우 next는 return까지함 (VC f10)
step은 함수도 파고 들어가 한줄한줄  ( f11 )

gdb)nexti       (asem에선 뒤에 i 추가)      인스트럭션단위
       stepi


gdb)print      gdb)p (변수이름)       => 값보기

 
gdb)bt          => backtrace  (call stack개념)  어떤 함수들을 거쳐 왔는지
gdb)display (변수)  => 현 위치부터 gdb)프롬프트 뜰때마다 계속 설정 변수값 출력.  undisplay할때까지.

gdb)set var=expr         => 변수값바꿔서 진행시



-메모리 덤프
x/<갯수X자료형>   주소    * (      )
                                                           0x10000
x/4X 0x10000             <=        int var[4]           1  |  2  |  3  |  4
     c
      b
      s
x(16진) c(char) b(byte) s(string)

-whatis (변수)      => show data type of expr [or $] without