gdb를 이용해 디버깅을 하기 위해서는 컴파일 옵션에 -g 옵션을 붙여야 한다.
gcc -g -o test test.c
-g 옵션을 붙이게 되면, 컴파일 되는 실행 파일에 여러 디버깅 정보가 삽입되기 때문이다.
프롬프트 창에서 gdb test
(gdb)set prompt main:
이렇게 하면...(gdb)대신에 main: 이 나오게 된다.
gdb종료방법 - q입력
1. 소스보기
명령어 : l (list)
set listsize 20 20줄씩 보게된다.
특정 줄이나 함수로 이동하고자 할 때
l main , l 25
l file.c:func:
프로그램 실행
명령어 : r (run)
브레이크 포인트 설명전에 미리 입력해야 한다. gdb를 실행하고 나면 디버깅할 준비중이다.
r명령을 내림으로써 디버깅에 들어간다.
2. 브레이크 포인트
명령어 : b (break)
특정 부분에 브레이크를 거는 작업이다. 요것이 무엇인고...하니, 간략히 말하자면... 문제가 발생한 부분에 브레이크를 걸어, r명령으로 프로그램을 수행하면, 브레이크를 건 부분에서 프로그램이 멈추는 것을 볼 수 있다. 브레이크는 특정 라인에 걸거나 함수에 걸수 있다.
b 19, b main, b file.c:10, b -2, b 10 if tmp ==0
b -2 명령은 현재 행으로부터 2줄 이전에 브레이크를 거는것이고
b 10 if tmp ==0은 10행에 브레이크를 거는데 tmp라는 변수가 0일때 작동한다는 의미이다.
브레이크 포인트를 지우기
cl (clear) 지우고 싶은 해당라인 또는 함수
d 모든 브레이크 지우기
info break 설정되어 있는 브레이크 포인트를 보는 명령어
3. 프로그램 수행
명령어 : r (run) : 프로그램 수행
명령어 : k (kill) : 프로그램 수행 종료
명령어 : s (step) : 현재 행 수행 후 정지, 함수 호출 시 함수 내부로 들어감
명령어 : n (next) : 현재 행 수행 후 정지, 함수 호출 시 함수 수행 후 다음 행으로 감
명령어 : c (continue) : 브레이크 포인트를 만날때까지 계속 진행
명령어 : u (until) : 현재 루프를 빠져나감
명령어 : finish : 현재 함수를 수행하고 빠져나감
명령어 : return : 현재 함수를 수행하지 않고 빠져나감
명령어 : si : 현재의 인스트럭션을 수행, 함수 호출 시 함수 내부로 들어감
명령어 : ni : 현재의 인스트럭션을 수행, 함수 호출 시 함수 내부로 들어가지 않음
4. 와치 포인트
명령어 : watch
예)Watch i
i 변수에 와치 포인트를 설정하고 i 변수가 바뀔 때마다 브레이크가 걸리면서 i변수의 이전 값(Old value)과 현재값(new value)을 출력한다.
5. 변수와 레지스트 값 출력
명령어 : info locals : 현재 상태에서의 지역변수 출력
명령어 : info variables : 현재 상태에서의 전역변수 리스트 출력
명령어 : p (printf) : 개별 변수 출력
display를 이용한 변수 값 출력
명령어 : display i
display i
이 명령을 쓰면 s명령으로 한 행씩 진행하면서 p명령으로 매번 변수 값이 어떻게 변경되었는지 확인을 쉽게 할 수 있다.
더이상 디스플레이되지 않는 변수를 지운거나, 변수값의 출력이 충분할때에는 undisplay i
6. 스택 상태 검사
명령어 : bt (backtrace) : 전체 스택 출력
명령어 : info f (frame) : 스택의 정보 출력
명령어 : info args : 함수가 호출 될 때 인자를 출력
명령어 : info locals : 함수의 지역변수를 출력
위 명령어를 입력하기 전엔 프로그램이 실행중이어야 한다. 그렇지 않고 그냥 info f 를 한다거나 bt를 한다면 스택이 없다고 출력된다.
스택은 하나일 수도 있고, 여러개 일 수도 있다.
일단 bt 명령으로 전체 스택을 보면, 각 스택의 번호가 매겨져 있다.
frame 3 한다면... bt로 봤던 여러 스택중, 3번 스택으로 이동하게 되겠다.
up한다면 한단계 상위 스택 프레임으로 이동, down한다면 한단계 하위 스택 프레임으로 이동 한다.
세그멘테이션 오류나 다른 기타 오류등을 판별할 때, 스택의 상태를 검사해 봄으로써 해결할 수 있는 경우가 많고, 스택 프레임 정보에는 함수를 호출하거나 할 때 인자와 함께 리턴 어드레스가 들어가 있기 때문에 디버깅시 더 중요하다고 할수 있다. 그래서 함수의 인자 값을 읽어봄으로써 함수가 제대로 호출되었는지 확인할수 있고, 리턴 어드레스를 읽어봄으로써 어떤 함수의 어떤 부분에서 해당 함수를 호출 했는지 알 수 있다.