drcarter의 DevLog

[TIP] GDB debugging 하기

tip2009. 9. 11. 11:35

[GDB]

1. gdb를 위한 컴파일 옵션 : -g   (ex) gcc -g -o bugprg bugprg.c
   : -g옵션을 주고 컴파일 할 때는 -O(최적화 옵션) 옵션을 사용하지 않는 것이 좋다.
     → 최적화 옵션을 준 경우 어셈블리 코드 자체에 많은 변경이 가해지기 때문...


2. gdb 시작: gdb [프로그램명] or gdb [프로그램명] [core 파일명]
             or gdb [프로그램명] [실행 중인 프로세스 PID]

   gdb 종료: q or Ctrl + d


3. gdb 소스보기 : l(list) - main 함수를 기점으로 소스 출력
                  l 함수명 - 함수의 소스를 출력
                  l 라인넘버 - 라인넘버를 기준으로 소스 출력
                  l 파일명:func - 해당 파일의 func 함수 부분을 출력
                  l 파일명:라인넘버 - 해당 파일의 라인넘버를 기준으로 출력

                  set listsize 행수 : 출력되는 행 수를 변경한다.


4. gdb 프로그램 실행 : r
                       r arg1 arg2 - arg1과 arg2를 인자로 프로그램 수행


5. gdb 수행 Step : s [숫자] (현재 행을 수행하고 멈춘다 - 내부로 들어감)
                   si (현재의 인스트럭션을 수행. 함수 호출 시 함수 내부로 들어감)
     n [숫자] (현재 행을 수행하고 멈춘다 - 내부로는 들어가지 않음)
                   ni (현재의 인스트럭션을 수행. 함수 호출 시 함수 내부로 들어감)
                   c (브레이크 포인트를 만날 때까지 멈추지 않고 계속 수행한다.)
                   u (현재 루프를 빠져 나감)
                   finish (현재 함수를 수행하고 빠져 나감)
                   return [숫자] (현재 함수를 수행하지 않고 빠져 나감. 숫자=리턴값 강제 부여)
                  

6. gdb 프로그램 수행 종료 : k


7. gdb 브레이크 포인트 설정 : b [브레이크 포인트로 설정할 부분]
                              b func - func 함수의 시작 부분에 브레이크 포인트 설정
                              b 10 - 10행에 브레이크포인트 설정
                              b file.c:func - file.c파일의 func 함수에 브레이크 포인트 설정
         b file.c:10 - file.c파일의 10행에 브레이크 포인트 설정
                              b +2 - 현재 행에서 2개 행 이후 지점에 브레이크 포인트 설정
         b -2 - 현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정
                              b *0x8049000 - 0x8049000주소에 브레이크 포인트 설정(어셈블리 디버깅시 사용)
                              b 10 if var == 0 - 10행에 브레이크 포인트를 설정하는데 var변수값이 0일 때 작동


8. gdb 브레이크 포인트 해제 : cl [해제할 브레이크 포인트]
                              cl func - func 함수의 시작 부분에 브레이크 포인트 지움
                              cl 10 - 10행의 브레이크 포인트 지움
                              cl file.c:func - file.c 파일의 func 함수에 브레이크 포인트를 지움
                              cl file.c:10 - file.c 파일의 10행의 브레이크 포인트 지움
                              d - 모든 브레이크 포인트를 지움


9. 현재 설정된 브레이크 포인트 보기 : info breakpoints


10. 변수 관련 부분

ⓐ Watch 포인트 설정 : 변수값이 어떻게 바뀌는지 그리고 어떤 코드가 바꾸는지에 대하여 확인할 때 사용한다.
                       
                        * watch [변수명]
                         - 변수가 바뀔 때마다 브레이크가 걸리면서 변수의 이전 값과 현재 값을 출력하는 모습을 보여준다.

ⓑ 전체 변수의 출력 : info locals - 현재 상태에서 어떤 지역변수들이 있으며 각각의 값들은 무엇인지 보인다.

ⓒ 개별 변수의 출력 : p [변수명] - 해당 변수 주소와 값 출력 (포인터 변수 보는 법은 C언어 코딩과 같다.)
                       p [함수명] - 함수의 주소값 출력
         p $[레지스트리 명] - 레지스트리 값을 출력
                                            ※ info registers - 레지스트 값 전체를 한번에 보는 명령어
                                               info all-registers - MMX 레지스트를 포함한 거의 대부분의 레지스트 값을 출력
 
         p *pt@4 - (pt=포인터변수) @은 배열의 크기를 gdb에 알리는 경우 사용한다.
                       p '[파일명]'::[변수명] : 특정한 파일의 전역변수를 지정하고자 할 때 사용.
                       p [함수명]::[변수명] : 특정 함수의 static 변수 값을 확인하고자 할 때 사용.

ⓓ 출력 형식 지정 : p /[출력형식] [변수]
                     [출력 형식]
                     t : 2진수로 출력
                     o : 8진수로 출력
                     d : 부호가 있는 10진수로 출력(int)
                     u : 부호가 없는 10진수로 출력(unsigned int)
                     x : 16진수로 출력
                     c : 최초의 1바이트 값을 문자형으로 출력
                     f : 부동 소수점 값 형식으로 출력
                     a : 가장 가까운 심볼의 오프셋을 출력
                    
ⓔ 타입 변환 출력 : p (캐스팅 연산자) 변수명
                     - C언어의 캐스팅과 같다.

ⓕ 변수값 설정 : p [변수명] = 값

ⓖ 변하는 변수값 자동으로 디스플레이 하기
   : display [변수명] : 변수값을 자동으로 디스플레이
     display /[출력형식] [변수명] : 변수값을 출력 형식으로 자동으로 디스플레이
     undisplay [디스플레이 번호] : 디스플레이 종료
     disable display [디스플레이 번호] : 디스플레이를 일시 중단한다.
     enable display [디스플레이 번호] : 디스플레이를 다시 활성화한다.


11. 스택프레임에 있는 정보를 이용하여 디버깅 하기
    : info frame  - 스택 프레임 정보를 출력
      info args   - 함수가 호출될 때 인자를 출력
      info locals - 함수의 지역변수를 출력
      info catch  - 함수의 예외 핸들러를 출력
      bt          - 전체 스택 프레임 출력 (간략하게)        
      frame [N]   - n번 스택 프레임으로 변경
      up          - 상위 스택 프레임으로 이동
      up [N]      - n번 상위 스택 프레임으로 이동
      down        - 하위 스택 프레임으로 이동
      down [N] - n번 하위 스택 프레임으로 이동
     

12. 메모리 상태 검사
    : x/[범위][출력형식][범위의 단위]

      <출력 형식>
      t : 2진수로 출력
      o : 8진수로 출력
      d : 부호가 있는 10진수로 출력(int)
      u : 부호가 없는 10진수로 출력(unsigned int)
      x : 16진수로 출력
      c : 최초의 1바이트 값을 문자형으로 출력
      f : 부동 소수점 값 형식으로 출력
      a : 가장 가까운 심볼의 오프셋을 출력
      s : 문자열로 출력
      i : 어셈블리 형식으로 출력

      <범위 단위>
      b : 1바이트 단위
      h : 2바이트 단위
      w : 4바이트 단위
      g : 8바이트 단위


13. 기타

    ⓐ 어셈블리 코드 보기
       * disas [함수명] : 함수의 어셈블리 코드를 출력한다.
       * disas [주소1] [주소2] : 주소1 ~ 주소2 범위 사이의 어셈블리 코드를 출력

    ⓑ call 명령을 사용해서 함수별 모듈 테스트
       * call [함수] : 함수를 임의로 호출할 수 있다.
       * junp [함수 or *주소 or 행수] : 임의의 행, 주소 또는 함수로 무조건 분기하는 명령

    ⓒ 디버깅하는 프로세스에 시그널을 보냄
       * signal [인터럽트 시그널] : 디버깅 대상의 프로세스에게 시그널을 보낼 수 있다.
       * info signals : 시그널의 종류 출력

    ⓓ 메모리 특정영역에 값을 설정
       * set {타입}[주소] = [값] : 메모리 특정 주소에 값을 저장

    ⓔ gdb 환경 설정 관련 명령 및 정보 출력 명령
       * set prompt woos: - "(gdb) → woos: 로 바꾼다."
       * set print array on - "주소, 값 " 쌍으로 출력. 여러 행에 출력된다.
       * info set - 변경 가능한 환경 설정 출력
       * info functions - 함수들의 리스트를 출력
       * info types - 선언된 타입에 대해서 볼 수 있다.
       * info 입력 후 Tab키 두 번 누름 - info 명령으로 확인 가능한 정보들 출력.