본문 바로가기

도구의발견

GDB Tutorial

GDB Tutorial

디버거는 다른 프로그램을 라인 단위 또는 변수 단위로 실행 시키면서 메모리에서 일어나고 있는 일을들 확인 할 수 있는 프로그램이다. 그 중 가장 유명한 디버거로는 UNIX의 GDB가 있다. 다음의 링크에는 GDB에 관한 보다 자세한 온라인 문서가 있다(documentation for GDB online), 또는 man 페이지에서 보다 빨리 GDB에 대한 정보를 얻을 수 있을 것이다.

Starting GDB

GDB를 사용하기 위해서는 컴파일 시에 -g 플래그를 사용하여야 한다.
$ gcc -g trees.c   ※ c++ 사용자라면 g++ -g trees.cpp 라고 해도 된다.
위와 같은 작업 후엔 a.out 이라는 실행 가능 파일이 생성 된다(만일 -o 플래그로 다른 이름을 줄 수도 있다) 이 프로그램을 gdb의 컨트롤 하에 실행 시키기 위해서는 다음과 같이 커맨드 창에 입력 한다. $ gdb a.out
이것은 텍스트 기반 gdb를 사용 할 수 있게 해준다.

GDB commands 

GDB가실행 된다고 해도, 실질적으로 프로그램(a.out)이 실행 되고 있는 것은 아니다. 사용자가 run이라는 명령어로 gdb가 어떻게 동작 할지에 대한 지정을 해주기 전 까지는 gdb는 동작하지 않는다.
  • run command-line-arguments
    위에서 입력했던 프로그램(a.out)을 실행 시킨다.
    a.out command-line-arguments 
    또는 아래와 같이 칠수 도 잇다.
    a.out < somefile 
  • break place
    브레이크 포인터를 생성해 주는 명령어다. 브레이크 포인터란 프로그램이 실행되면서 강제적으로 멈추어지기 전의 위치이다. 대부분의 브레이크 포인터는 아래와 같이 함수의 이름으로 지정할 수 있다. 
    (gdb) break Traverse
    Breakpoint 2 at 0x2290: file main.c, line 20
    또는 브레이크 포인터를 소스 파일의 특정한 라인 자체로 지정할 수 있는 방법도 있다.
    (gdb) break 20
    Breakpoint 2 at 0x2290: file main.c, line 20
    프로그램이 브레이크 포인트 까지 실행 되면, 아래와 같은 메시지를 볼 수 있다.
    Breakpoint 1, Traverse(head=0x6110, NumNodes=4)
    at main.c:16
    (gdb)
    http://kukuta.tistory.com/163 <- more info for breakpoint
  • delete N
    지정되어 있는 번호의 브레이크 포인트를 제거한다. 현재 지정되어 있는 브레이크 포인터에 대한 정보를 보고 싶다면 info break 를 치면 된다(맨 앞에 Num 이라는 컬럼을 N에 적어 주면 된다)

  • help command
    현재 GDB에 명령어에 대한 도움말을 출력 한다. 단순 help 만을 치게 된다면 help에서 보여 줄 수 있는 도움말의 리스트를 보여 준다.

  • step
    현재 라인을 수행한다. 만일 함수 호출이 있다면 해당 함수로 포인터를 넘긴다.

  • next
    step과 비슷하다. 하지만 현재 라인이 함수 호출을 하고 있다면 이 명령어는 함수를 수행하고 다음 라인에서 멈추게 된다.

  • finish
    next 커맨드를 계속 유지 시켜 포인터를 함수의 끝까지 보낸다.

  • Continue
    브레이크 포인터를 만날때 까지나 프로그램의 스톱이 될때 까지 프로그램을 수행 한다.
    첫번째가 대문자임에 유의 하도록 하자.

  • where
    함수 호출 스택에 따른 현재 위치를 보여준다.
    예를 들어 현재 main에서 호출한 func1 이라는 함수에 있다면 이 커맨드는 현재 호출 된 main-func1 순서의 함수 호출 스택을 보여 준다. 이 명령어는 backtrace와 똑같다.

  • print E
    변수에 들어 있는 값을 출력한다. display와 비슷하다.

  • display E
    변수에 들어 있는 값을 출력함은 print와 동일하지만 print은 한번만 출력하고 그치는 반면에, display는 매 스탭마다 변수에 들어 있는 값을 출력한다.

  • list
    소스 코드를 출력 한다.
    기본적으로 0라인 부터 출력을 10라인씩 출력하며, list 명령을 내릴 때마다 10라인 씩 뒤의 코드를 출력한다.
    list 명령 뒤에 출력이 시작 될 라인을 지정해 줄 수 있다.

  • quit
    GDB를 끝낸다
원문 보기 : http://www.cs.princeton.edu/~benjasik/gdb/gdbtut.html

email : kukuta@gmail.com

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!