[Linux] GDB (GNU Debugger) 사용하기 - 1

 

# GNU Debugger

 - 프로그램 실행 중 특정 위치에서 프로그램이 어떤 상태인지 또는 어떤 동작을 하고 있는가를 감시할 수 있게 해 줌

 - Segmentation Fault 등의 error도 gdb를 사용하면 쉽게 해결 할 수 있음. ( 더 이상 printf 로 스무고개 하지 말자... )


# 설치 하기

  • GCC (컴파일러) 설치
apt-get install gcc


  • GDB (디버거) 설치
apt-get install gdb



# 사용하기


  • 준비 하기

아래와 같이 예제 파일을 하나 작성하고, 컴파일을 하고 실행 해 봅시다.

// hello.c

#include <stdio.h>

int main(void)
{
	printf("Hello World\n");
    
	return 0;
}


gcc hello.c -o hello


  • gdb 실행 하기

'gdb'를 입력하여 gdb를 실행 합니다, 종료 하려면 'quit' 을 입력하면 됩니다.


  • 디버깅 대상 선택 하기

2가지 방법이 있습니다.

  1. gdb 실행 후, file 커맨드를 사용하여 선택하기


  2. gdb 실행시 인자로 건네 주기.



  • 코드 실행 하기

'run' 명령어를 입력합니다. (약자로 'r' 만 입력 해도 됩니다.)



  • 코드 확인 하기
  • 디버깅을 하기 위해서는 컴파일 시에 -g 옵션을 주어 심볼(디버깅을 위한 정보)을 포함하게 해야 합니다.
gcc -g hello.c -o hello


'list' 명령어를 입력합니다. (약자로 'l' 만 입력해도 됩니다.)


  • gdb 실행 시 인자 넘겨주기

다음 예제 코드는, 실행 시 인자를 받아서 인자 갯수를 출력 합니다. 

// num_argc.c
#include <stdio.h>

int main(int argc, char **argv)
{
        printf("Number of Args = %d\n", argc);

        return argc;
}


다음과 같이 gcc에서 -g 옵션을 사용해 컴파일하고 실행 파일을 만듭니다.

gcc -g num_arg.c -o num_arg



  1. gdb 실행 시 인자를 넘겨 주는 방법


gdb --args [실행파일] [인자1] [인자2] [인자3] ... [인자N]



  2. gdb 실행 후 인자를 넘겨 주는 방법

일단 먼저 gdb를 실행 해 줍니다.

gdb num_arg


그 다음 gdb 내에서 run 커맨드 뒤에 인자를 넘겨서 실행합니다.

(gdb) run [인자1] [인자2] [인자3] ... [인자N]



이걸로 기본적인 준비는 끝났습니다. 다음 포스트에서 브레이크 포인트를 잡고 실제로 사용하는 방법을 알아 보겠습니다.


  • Segmentation Fault 확인 해보기

Segmentation Fault 디텍션이 가능한지 테스트 해보고 넘어가 봅시다.

// seg.c

#include <stdio.h>
#include <string.h>

char *g_str;

int main(void)
{
        strcpy(g_str, "hello");
        printf("%s\n", g_str);

        return 0;
}

일반적으로 그냥 실행 하면, 죽었다 으악 만 하고 끝납니다.

그래서 처음 C언어를 배웠을 떄는 printf로 어디에서 죽는지 하나씩 다 찍어보는 노가다를 했었습니다...


하지만, gdb 에서 실행 해주면 어느 라인에서 문제가 되는지 알려 줍니다.



이 블로그의 인기 게시물

Crusader Kings 3 - Converting DNA code using Portrait Editor