본문 바로가기
Linux

[Linux] gdb 명령어 정리 및 예제 실습

by Junk_Seo 2023. 12. 8.
반응형

1. 개요

  • linux c 개발에서 디버깅을 위한 gdb 명령어 정리 및 실습을 진행합니다.

2. gdb 사용 조건

  • gdb를 사용하기 위해선 컴파일 옵션에 "-g" 옵션을 사용해야 합니다.
  • 또한 최적화 옵션을 사용하지 않는 것이 디버깅 시 좋습니다.

3. 예제 소스

  • gdb 명령어 테스트를 위한 소스 예제입니다.
  • 예제는 다음과 그림과 같이 구성하였습니다.
  • 소스 파일
    • main.c
      #include <stdio.h>
      #include <stdlib.h>
       
      #include <main.h>
      #include <cal.h>
       
      int main(int argc, char **argv)
      {
          int i = 0;
          int nData1 = 0;
          int nData2 = 0;
          int nResult = 0;
          int narResult[5] = {0, };
          double dResult = 0;
       
          if(1 < argc)
          {
              printf("명령 인수 = [%s]\n", argv[1]);
          }
       
          nData1 = 100;
          nData2 = 10;
          nResult = Add(nData1, nData2);
          printf("Result = [%d]\n", nResult);
       
          nData1 = 11;
          nData2 = 22;
          nResult = Add(nData1, nData2);
          printf("Result = [%d]\n", nResult);
       
          nData1 = 50;
          nData2 = 5;
          nResult = Minus(nData1, nData2);
          printf("Result = [%d]\n", nResult);
       
          nData1 = 10;
          nData2 = 99;
          nResult = Minus(nData1, nData2);
          printf("Result = [%d]\n", nResult);
       
          nData1 = 12;
          nData2 = 11;
          nResult = Mul(nData1, nData2);
          printf("Result = [%d]\n", nResult);
       
          nData1 = 50;
          nData2 = 20;
          nResult = Mul(nData1, nData2);
          printf("Result = [%d]\n", nResult);
       
          nData1 = 10;
          nData2 = 10;
          dResult = Div(nData1, nData2);
          printf("Result = [%lf]\n", dResult);
       
          nData1 = 100;
          nData2 = 0;
          dResult = Div(nData1, nData2);
          printf("Result = [%lf]\n", dResult);
       
          for (i = 0; i < 5; i++)
          {
              narResult[i] = test_func(i);
              printf("Result = [%d]\n", narResult[i]);
          }
       
          printf("Finish!!\n");
        
          return 0;
      }​
    • main.h
      #ifndef _MAIN_H_
      #define _MAIN_H_ 1
       
       
       
      #endif /* _MAIN_H_ */​
    • cal.c
      #include <stdio.h>
      #include "cal.h"
       
      int g_nData = 10;
       
      int Add(int n1, int n2)
      {
          int nResult = 0;
           
          nResult = n1 + n2;
       
          return nResult;
      }
       
      int Minus(int n1, int n2)
      {
          int nResult = 0;
       
          nResult = n1 - n2;
       
          return nResult;
      }
       
      int Mul(int n1, int n2)
      {
          int nResult = 0;
       
          nResult = n1 * n2;
       
          return nResult;
      }
       
      double Div(int n1, int n2)
      {
          double dResult = 0;
       
          if (0 == n2)
          {
              return -1;
          }
       
          dResult = (double)(n1 / n2);
       
          return dResult;
      }
       
      int test_func(int nData)
      {
          static int nValue = 0;
          int nResult = 0;
       
          nResult = g_nData * nData + nValue;
       
          nValue++;
       
          return nResult;
      }​
    • cal.h
      #ifndef _CAL_H_
      #define _CAL_H_ 1
       
      int Add(int n1, int n2);
      int Minus(int n1, int n2);
      int Mul(int n1, int n2);
      double Div(int n1, int n2);
       
      #endif /* _CAL_H_ */​
    • Makefile
      GCC = gcc
      CFLAGS = -Wall -g -O0
       
      .c.o:
          $(GCC) $(CFLAGS) $(INCS) -c -o $@ $<
       
      TOPDIR = .
      BIN_PATH = $(TOPDIR)/bin
       
      TARGET_NAME = test_main
      TARGET = $(BIN_PATH)/$(TARGET_NAME)
       
      SRCS = src/main.c src/cal.c
      OBJS = $(SRCS:.c=.o)
       
      INCS = -I./src
       
      all : $(TARGET)
       
      $(TARGET): $(OBJS)
          $(GCC) $(CFLAGS) -o $@ $^
       
      clean:
          $(RM) -f $(OBJS) $(TARGET)​

4. gdb 명령어 및 실습

  • gdb 사용에 필요한 명령어와 실습 내용입니다.

4.1. gdb 실행

  • 디버깅을 위해 gdb를 사용하여 프로그램을 로드합니다.
    명령어 설명
    gdb [프로그램 이름 <명령 인수>] gdb를 실행합니다.
    gdb [프로그램 이름] [core 파일]
    gdb [프로그램 이름] [실행 중인 PID]
  • 예제

4.2. gdb 종료

  • gdb를 종료합니다.
    명령어 설명
    quit gdb를 실행합니다.
    ctrl + d
  • 예제

4.3. gdb 중단점

  • 프로그램 수행 시 특정 지점 또는 특정 조건에서 중단점을 설정합니다.
    • break [함수 이름]
      • 함수의 시작 부분 중단점 설정합니다.
      • ex) break Add
      • 예제)
    • break  [라인 번호]
      • 라인 번호에 중단점을 설정합니다.
      • ex) break 14
      • 예제)
    • break  [파일 이름:라인 번호]
      • 특정 파일의 라인 번호에 중단점을 설정합니다.
      • ex) break cal.c:17
      • 예제)
    • break  [파일 이름 : 함수 이름]
      • 특정 파일의 함수 시작 부분에 중단점을 설정합니다.
      • ex) break cal.c:Mul
      • 예제)
    • break [+<offset>]
      • 현재 라인에서 offset 이후 지점에 중단점을 설정합니다.
      • ex) break +10
      • 예제)
         
    • break [+<offset>]
      • 현재 라인에서 offset 이전 지점에 중단점을 설정합니다.
      • ex) break -5
      • 예제)
    • break [*address]
      • 특정 주소에 중단점을 설정합니다.(어셈블리 디버깅 시 사용)
      • ex) break *0x00000080
    • break [<...> if <조건>]
      • 조건에 부합하는 경우 중단점을 설정합니다.
      • ex) break 10 if var ==10 : 10번 라인에서 var 값이 10인 경우 중단점 발생
      • 예제)
  • 설정된 중단점을 확인합니다.
    • info break
      • 설정된 중단점을 확인합니다.
      • 예제)
  • 설정된 중단점을 삭제합니다.
    • clear [함수 이름]
      • 설정된 중단점을 삭제합니다.
      • 예제)
    • clear [라인 번호]
      • 설정된 중단점을 삭제합니다.
      • 예제)
    • clear  [파일 이름 : 라인 번호]
      • 설정된 중단점을 삭제합니다.
      • 예제)
    • clear   [파일 이름 : 함수 이름]
      • 설정된 중단점을 삭제합니다.
      • 예제)
    • delete
      • 설정된 모든 중단점을 삭제합니다.
      • 예제)
    • delete [breakpoint 번호...]
      • 중단점 번호에 해당하는 중단점 삭제합니다.
      • 예제)
  • 중단점을 활성화/비활성화합니다.
    • enable
      • 모든 중단점을 활성화합니다.
      • 예제)
    • enable [breakpoint 번호...]
      • 중단점 번호에 해당하는 중단점을 활성화합니다.
      • 예제)
    • disable
      • 모든 중단점을 비활성화합니다.
      • 예제)
    • disable [breakpoint 번호...]
      • 중단점 번호에 해당하는 중단점을 비활성화합니다.
      • 예제)

4.4. gdb 프로세스 실행

  • gdb를 이용해 프로그램을 로드한 상태에서 프로그램을 실행시킵니다.
    • run
      • gdb를 이용하여 프로그램을 로드한 상태에서 실행시킵니다.
      • 명령 인수는 run 명령어 뒤에 준다.
      • 예제 1) run
      • 예제 2) run [명령 인수]
    • continue [n]
      • 다음 break point까지 프로그램을 실행합니다.
      • 다음 n 번의 break point는 건너뛰고 프로그램을 실행합니다.
      • 예제)
    • next [n]
      • 프로그램을 한 줄 실행, 함수 내부로 진입하지 않는다.
      • 프로그램을 n 줄 실행, 함수 내부로 진입하지 않는다.
      • 예제)
    • step [n]
      • 프로그램을 한 줄 실행, 함수 내부로 진입한다.
      • 프로그램을 n 줄 실행, 함수 내부로 진입한다.
      • 예제)
    • return [return value]
      • 현재 함수를 수행하지 않고 빠져나간다.
      • 현재 함수를 수행하지 않고 빠져나가면서 return 값을 설정한다.
      • 예제 1) return
      • 예제 2) return [return value]
    • finish
      • 현재 함수를 수행하고 빠져나간 후 리턴 값을 출력한다.
      • 예제)
    • kill
      • 실행 중인 프로그램을 종료한다.
      • 예제)

4.5. gdb 변수 및 주소 값 출력

  • gdb로 프로그램을 실행시킨 뒤 변수 및 주소값을 확인합니다.
    • info locals
      • 현재 지점에서 모든 지역 변수의 값들을 확인합니다.
      • ex) info locals
      • 예제)
    • info variables
      • 모든 전역변수의 값들을 확인합니다.
      • ex) info variables
      • 예제)
    • print [var]
      • var 변수의 값을 출력합니다.
      • ex) print nValue
      • 예제)
    • print  [*ptr]
      • ptr 포인터의 값을 출력합니다.
      • ex) print *narResult
      • 예제)
    • print  ['파일'::전역변수]
      • 특정 파일의 전역 변수 값을 확인합니다.
      • 파일 명은 ''(작은따옴표)로 감싸야합니다.
      • ex) print 'cal.c'::g_nData
      • 예제)
    • print  [함수::static 변수]
      • 특정 함수의 static 변수 값을 확인합니다.
      • ex) print Add::nValue
      • 예제)
    • print  [배열[n]]
      • 배열의 n 번째 값을 출력합니다.
      • 예제)
    • print  [*array@len]
      • array 배열의 값을 len 수만큼 출력합니다.
      • ex) print *array@2
      • 예제)
    • print  [/출력 옵션 var]
      • var 변수의 값을 출력 옵션에 맞게 출력합니다.
        • t : 2 진수 출력
        • o : 8 진수 출력
        • d : 부호 있는 10 진수 출력
        • u : 부호 없는 10 진수 출력
        • x : 16 진수 출력
        • c : 최소 1바이트 값을 문자형으로 출력
        • f : 부동 소수점 형식으로 출력
      • 예제)
    • display [/출력 옵션 var]
      • var 변수의 값을 매번 출력합니다.
      • 출력 옵션은 print 명령어의 출력 옵션과 동일합니다.
      • 예제)
    • info display
      • 설정된 display 옵션을 보여줍니다.
      • 예제)
    • undisplay
      • display 옵션을 제거합니다.
      • 예제)
    • enable display
      • display 옵션을 활성화합니다.
      • 예제)
    • enable display [display 번호]
      • 특정 display 옵션을 활성화합니다.
      • 예제)
    • disable display
      • display 옵션을 비활성화합니다.
      • 예제)
    • disable display [display 번호]
      • 특정 display 옵션을 비활성화합니다.
      • 예제)

4.6. gdb 소스 파일 출력

  • gdb로 프로그램을 실행시킨 뒤 소스 파일을 출력합니다.
    • list
      • 현재 위치의 주변 소스를 출력합니다.
      • 예제)
    • list [라인 번호]
      • 특정 라인 주변 소스를 출력합니다.
      • 예제)
    • list [함수]
      • 함수 주변 소스를 출력합니다.
      • 예제)
반응형