Programming/Linux(Unix)
(7/31) GNU Debugger(GDB)
부풍
2009. 7. 31. 16:45

대부분의 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