본문 바로가기

List/Linux

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)

한 개의 기계 명령어를 실행하고, 함수 호출을 만나면 함수가 반환 될 때 까지 진행합니다.

'List > Linux' 카테고리의 다른 글

ltrace 기본 사용법  (0) 2014.07.13
objdump 기본 사용법  (0) 2014.07.13
x86 스택의 구조  (0) 2014.07.12
setuid, setgid 파일 찾는 방법 (find)  (0) 2014.07.12
스택 버퍼 오버플로우 [Stack Buffer Overflow, bof]  (0) 2014.07.06