> 환경 및 유틸리티 > gdb

gdb: GNU 디버거

gdb(GNU Debugger)는 C, C++, Fortran 등 다양한 프로그래밍 언어로 작성된 프로그램의 실행을 분석하고 디버깅하는 강력한 도구입니다. 프로그램의 내부 동작을 이해하고, 버그를 찾고 수정하는 데 필수적입니다. 실행 중인 프로세스에 연결하거나, 코어 파일을 분석하는 등 다양한 디버깅 시나리오를 지원합니다.

개요

gdb는 프로그램의 실행 흐름을 제어하고, 변수 값을 검사하며, 메모리 상태를 확인하는 등 심층적인 디버깅 기능을 제공합니다. 특히 컴파일된 바이너리 파일의 문제점을 분석하는 데 유용합니다.

주요 기능

  • 실행 중인 프로그램 시작/중지
  • 중단점(breakpoint) 설정
  • 변수 값 검사 및 변경
  • 스택 트레이스 확인
  • 메모리 내용 검사
  • 코어 파일 분석

주요 옵션

gdb는 대화형 모드로 주로 사용되지만, 시작 시 특정 옵션을 통해 초기 설정을 하거나 비대화형 스크립트를 실행할 수 있습니다.

시작/연결 옵션

생성된 명령어:

명령어를 조합해 보세요.

설명:

`gdb` 명령어를 실행합니다.

위 옵션들을 조합하여 AI와 함께 가상으로 명령어를 실행해 보세요.

사용 예시

gdb는 대화형으로 사용되는 경우가 많으므로, 예시에서는 gdb 프롬프트 내에서 입력하는 명령어도 포함합니다.

기본 디버깅 세션 시작

gdb ./my_program

컴파일된 프로그램(예: my_program)을 gdb로 로드하여 디버깅 세션을 시작합니다.

중단점 설정 및 실행

gdb ./my_program
(gdb) b main
(gdb) r

main 함수에 중단점을 설정하고 프로그램을 실행합니다. 중단점에서 실행이 멈춥니다.

변수 값 확인

gdb ./my_program
(gdb) b my_function
(gdb) r
(gdb) p my_variable

중단점에서 멈춘 후, 특정 변수의 현재 값을 출력합니다.

코어 파일 분석

gdb ./my_program core.dump

프로그램 충돌로 생성된 코어 파일을 사용하여 충돌 당시의 프로그램 상태를 분석합니다.

실행 중인 프로세스에 연결

gdb -p 12345

이미 실행 중인 프로세스 ID(PID) 12345에 gdb를 연결하여 디버깅합니다.

시작 시 명령어 자동 실행

gdb -ex 'b main' -ex 'r' ./my_program

gdb 시작과 동시에 main 함수에 중단점을 설정하고 프로그램을 실행합니다.

설치

gdb는 대부분의 리눅스 배포판에서 기본적으로 제공되지 않으며, 개발 도구 패키지의 일부로 설치해야 합니다.

Debian/Ubuntu

sudo apt update && sudo apt install gdb

APT 패키지 관리자를 사용하여 gdb를 설치합니다.

Fedora/CentOS/RHEL

sudo dnf install gdb

DNF 또는 YUM 패키지 관리자를 사용하여 gdb를 설치합니다.

팁 & 주의사항

gdb를 효과적으로 사용하기 위한 팁과 주의사항입니다.

컴파일 시 디버그 정보 포함

gdb로 디버깅하려면 프로그램을 `-g` 옵션으로 컴파일하여 디버그 정보를 포함해야 합니다. 그렇지 않으면 소스 코드 정보나 변수 이름을 볼 수 없습니다.

  • 예시: `gcc -g myprogram.c -o myprogram`

자주 사용하는 gdb 명령어

gdb 프롬프트 내에서 자주 사용되는 핵심 명령어들입니다.

  • `b <함수명/라인번호>`: 중단점 설정 (breakpoint)
  • `r`: 프로그램 실행 (run)
  • `n`: 다음 줄로 이동 (next)
  • `s`: 함수 안으로 진입 (step)
  • `p <변수명>`: 변수 값 출력 (print)
  • `c`: 다음 중단점까지 실행 (continue)
  • `q`: gdb 종료 (quit)

TUI 모드 활용

gdb의 텍스트 사용자 인터페이스(TUI) 모드를 활용하면 소스 코드, 레지스터, 어셈블리 등을 함께 보면서 디버깅 효율을 높일 수 있습니다.

  • `gdb -tui <program>` 또는 gdb 내에서 `layout src` 명령어 사용

동일 카테고리 명령어