gdb의 기본 사용 방법
참고(gdb 매뉴얼, gdb manual) : http://korea.gnu.org/manual/release/gdb/gdb.html
gdb란? C나 C++로 쓰여진 프로그램을 디버깅 하는데 쓰이는 툴이다.
1. 프로그램 컴파일 시 -g 옵션을 추가하여야 디버깅이 가능하다.
2. #gdb test
만약 gdb 실행 시 안내문을 보기 싫다면 -q 옵션을 포함한다.
#gdb -q test
3. l(list)명령어는 소스를 10줄 보여준다.
4. r(run)명령어는 프로그램을 실행한다.
5. b(breakpoint) 설정
- (gdb) b 3, (gdb) b main, (gdb) b *main
6. info 명령어로 breakpoint 확인
- (gdb) info bre
breakpoint 설정 내역을 보면 (gdb) b 3 명령으로 설정된 브레이크 포인트는 Num 1로 명시되어있고 list 명령어로 나온 소스코드에서 3번라인에 브레이크 포인트를 걸었다.
(gdb) b main 명령으로 설정된 브레이크 포인트는 main함수 다음의 printf 함수에 브레이크 포인트를 걸어 main이 시작된 다음에 브레이크 포인트를 설정한다는 것을 알 수 있다.
(gdb) b *main 명령으로 설정된 브레이크 포인트는 소스 코드에서 { 문자 라인에 브레이크 포인트를 설정하여 main 함수의 내용이 시작되기 전에 브레이크 포인트를 설정한다는 것을 알 수 있다.
7. d(delete)명령어로 브레이크 포인트 삭제
(gdb) d [Num]
8. info reg $esp, info reg $esp, x/16xw $esp, x/4xw $esp 로 레지스터 확인
9. (gdb) disas [함수명] 명령어로 어셈블러 코드 덤프
10. x/bx main+0 명령어로 기계어 보기
엔터치며 하나씩 확인하면 된다.
추가적으로 브레이크 포인트 설정 시 b main+4 와 같이 어셈블리 코드 라인으로도 설정 할 수 있고, b *0xAABBCCDD, b 0xAABBCCDD 등 주소값으로도 설정이 가능하다.
11. c(continue) (=fg)
c 명령어는 프로그램이 마지막으로 멈춘 주소에서 프로그램을 다시 시작한다.
[매뉴얼 '계속과 단계' 참조] - (매뉴얼 url은 본 포스팅 맨 위에 있음)
12. n(next)
n 명령어는 소스 코드를 한 줄씩 진행합니다. 진행 중에 함수 호출을 만나도 중지 없이 실행되고,
n [count] 명령어를 이용해 몇 라인을 실행 할 지 반복 횟수를 정해줄 수 있습니다.
13. s(step)
s 명렁어는 소스 코드를 한 줄씩 진행하다가 서브루틴을 만나면 서브 루틴으로 들어갑니다.
만약 컴파일 시 -g 옵션을 붙이지 않고 컴파일한다면 해당 프로그램은 디버깅 정보를 담고있지 않아서 서브 루틴으로 들어가지 않고 next 처럼 동작합니다.
s [count] 명령어를 이용하면 next와 같이 몇 라인을 실행 할 지 반복 횟수를 정해줄 수 있습니다.
14. si(stepi)
한 개의 기계 명령어를 실행합니다.
15. ni(nexti)
한 개의 기계 명령어를 실행하고, 함수 호출을 만나면 함수가 반환 될 때 까지 진행합니다.