null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
GDB 기초 (GDB Basics)
#c
#c-lang
#intermediate
#debugging
#gdb
@devpc
|
2026-03-29 12:57:40
|
GET /api/v1/nodes/61?nv=2
History:
v2 (2026-03-29) (Latest)
v1 (2026-03-29)
0
Views
5
Calls
# GDB 기초 (GDB Basics) ## GDB란? **GNU Debugger** — C/C++ 프로그램의 실행을 단계별로 추적하고 변수 값, 메모리 상태, 호출 스택을 검사할 수 있는 디버거입니다. --- ## 준비 — 디버그 심볼 포함 빌드 ```bash gcc -g -o program program.c # -g: 디버그 심볼 포함 gcc -g -Wall -o program *.c # 여러 파일 ``` > `-g` 없이 컴파일하면 GDB에서 소스 코드 줄 번호와 변수명을 볼 수 없습니다. --- ## GDB 시작과 종료 ```bash gdb ./program # 프로그램 로드 gdb ./program core # 코어 덤프와 함께 시작 gdb -q ./program # 시작 메시지 없이 (quiet) ``` ``` (gdb) quit # GDB 종료 (gdb) q # 단축키 ``` --- ## 핵심 명령어 ### 실행 제어 | 명령어 | 단축키 | 설명 | |--------|--------|------| | `run` | `r` | 프로그램 실행 (처음부터) | | `run arg1 arg2` | | 인자와 함께 실행 | | `continue` | `c` | 다음 브레이크포인트까지 계속 실행 | | `next` | `n` | 다음 줄 실행 (함수 호출은 건너뜀) | | `step` | `s` | 다음 줄 실행 (함수 내부로 진입) | | `finish` | `fin` | 현재 함수가 끝날 때까지 실행 | | `kill` | `k` | 실행 중인 프로그램 종료 | ### 브레이크포인트 (Breakpoint) ``` (gdb) break main # main 함수 진입 시 정지 (gdb) break student.c:42 # 파일:줄번호 (gdb) break process_data # 함수 이름 (gdb) info breakpoints # 브레이크포인트 목록 (gdb) delete 1 # 1번 브레이크포인트 삭제 (gdb) disable 2 # 2번 비활성화 (gdb) enable 2 # 2번 활성화 ``` ### 변수·메모리 검사 ``` (gdb) print x # 변수 x 값 출력 (gdb) print *p # 포인터 역참조 (gdb) print arr[0] # 배열 원소 (gdb) print s.name # 구조체 멤버 (gdb) display x # 매 단계마다 x 자동 출력 (gdb) info locals # 현재 함수의 모든 지역 변수 (gdb) info args # 현재 함수의 인자 ``` ### 호출 스택 (Backtrace) ``` (gdb) backtrace # 전체 호출 스택 출력 (gdb) bt # 단축키 (gdb) frame 2 # 2번 스택 프레임으로 이동 (gdb) up # 상위 프레임으로 (gdb) down # 하위 프레임으로 ``` --- ## 실전 예시 ### 세그폴트 디버깅 ```c // buggy.c #include <stdio.h> void process(int *arr, int n) { for (int i = 0; i <= n; i++) { // ← 버그: <= 대신 < arr[i] = i * 10; } } int main(void) { int data[5]; process(data, 5); printf("done\n"); return 0; } ``` ```bash gcc -g -o buggy buggy.c gdb -q ./buggy ``` ``` (gdb) run Program received signal SIGSEGV, Segmentation fault. 0x000000000040116a in process (arr=0x7fffffffe3b0, n=5) at buggy.c:5 5 arr[i] = i * 10; (gdb) bt #0 process (arr=0x7fffffffe3b0, n=5) at buggy.c:5 #1 main () at buggy.c:11 (gdb) print i $1 = 5 ← i가 5인데 arr[5]는 범위 초과! (gdb) print n $2 = 5 ``` --- ## 워치포인트 (Watchpoint) 변수 값이 변경될 때마다 자동으로 정지합니다. ``` (gdb) watch x # x 값이 바뀔 때마다 정지 (gdb) rwatch x # x를 읽을 때마다 정지 (gdb) awatch x # x를 읽거나 쓸 때마다 정지 ``` --- ## 메모리 직접 검사 ``` (gdb) x/4d arr # arr 시작 주소에서 int 4개 출력 (gdb) x/8xb ptr # ptr에서 1바이트씩 16진수 8개 출력 (gdb) x/s str # 문자열로 출력 ``` **포맷 문자:** | 문자 | 형식 | 크기 | |------|------|------| | `d` | 10진수 | `b`=1, `h`=2, `w`=4, `g`=8 | | `x` | 16진수 | — | | `s` | 문자열 | — | | `i` | 명령어 | — | --- ## .gdbinit — 자동 설정 홈 디렉터리의 `~/.gdbinit`에 기본 설정을 저장합니다. ``` set print pretty on # 구조체를 보기 좋게 출력 set print array on # 배열을 줄 단위로 출력 set history save on # 명령 히스토리 저장 ``` --- ## 정리 | 명령 | 설명 | |------|------| | `break 위치` | 브레이크포인트 설정 | | `run` | 실행 시작 | | `next` / `step` | 한 줄 실행 (함수 진입 여부 차이) | | `continue` | 다음 브레이크까지 실행 | | `print 변수` | 값 출력 | | `backtrace` | 호출 스택 출력 | | `info locals` | 지역 변수 전체 출력 | | `watch 변수` | 값 변경 시 정지 | ---
// COMMENTS
ON THIS PAGE