디버깅과 오류 처리
1. 주요 에러 메시지 이해
C 언어를 컴파일할 때 자주 만나는 에러 메시지를 잘 이해하면 빠르게 문제를 해결할 수 있습니다. 에러 메시지를 읽고 원인을 파악하는 능력은 초보자에게 매우 중요한 역량 중 하나입니다. 아래는 대표적인 에러 메시지와 그 원인입니다.
- undefined reference to: 정의되지 않은 함수나 변수에 접근할 때 발생합니다. 헤더 파일만 포함하고 실제 정의(.c 파일)를 링크하지 않은 경우도 포함됩니다.
- segmentation fault: 유효하지 않은 메모리 공간에 접근할 때 발생합니다. 포인터 오류, NULL 포인터 접근, 배열 인덱스 초과 등에서 자주 발생합니다.
- expected ';' before: 세미콜론이 빠진 경우입니다. 대부분 문장 끝에서 누락되어 컴파일러가 다음 문장을 해석하지 못할 때 발생합니다.
- conflicting types for: 함수 선언과 정의가 일치하지 않을 때 발생합니다. 반환형이나 매개변수 타입이 다를 경우입니다.
예제 - 세미콜론 누락
#include <stdio.h>
int main() {
printf("Hello, world!") // 세미콜론 빠짐
return 0;
}
오류 메시지: expected ';' before 'return'
2. 디버거 사용 방법 (GDB)
GDB는 GNU에서 제공하는 강력한 디버거입니다. C 프로그램의 흐름을 단계별로 추적하며, 변수의 값을 관찰하거나 특정 위치에서 프로그램을 일시 정지할 수 있습니다. CLI 환경에서도 효율적으로 사용할 수 있습니다.
디버깅을 위한 컴파일
gcc -g program.c -o program
-g 옵션은 디버깅 정보를 포함시켜 컴파일합니다.
GDB 명령어 기본
gdb ./program // 프로그램 실행
break main // main 함수에서 중단점 설정
run // 실행 시작
next // 다음 줄로 이동
print x // 변수 x의 값 출력
continue // 다음 중단점까지 실행
quit // GDB 종료
GDB 사용 예시
(gdb) break 10
(gdb) run
(gdb) print i
(gdb) next
TIP: Visual Studio Code, Code::Blocks, Eclipse CDT 같은 IDE에서는 GDB를 GUI로 통합해서 사용할 수 있습니다. 중단점 설정, 변수 관찰, call stack 분석 등을 시각적으로 할 수 있어 초보자에게 좋습니다.
3. 로그 출력 기법
가장 기본적이면서도 강력한 디버깅 방법은 printf를 이용해 중간값이나 변수 상태를 출력해 보는 것입니다. 함수 진입 시점, 조건 분기, 루프 반복 등 다양한 위치에서 로그를 출력하면 프로그램 흐름을 파악하기 쉽습니다.
예제 - 로그 출력
#include <stdio.h>
void debug_example(int x) {
printf("[DEBUG] x = %d\n", x);
}
int main() {
int value = 10;
debug_example(value);
return 0;
}
로그 레벨 분리하기
#define DEBUG 1
#if DEBUG
#define LOG(msg, val) printf("[DEBUG] " msg ": %d\n", val)
#else
#define LOG(msg, val)
#endif
int main() {
int score = 90;
LOG("Score", score);
return 0;
}
위 예제처럼 #define과 조건부 컴파일을 통해 로그 출력을 제어할 수 있습니다. 릴리즈 버전에서는 DEBUG를 0으로 설정하면 로그 출력이 제거되어 최적화에도 도움이 됩니다.
결론: 디버깅은 단순한 문제 해결을 넘어 프로그래밍 능력을 키우는 데 중요한 도구입니다. 에러 메시지를 잘 해석하고, GDB나 로그 출력을 적극적으로 활용하면 복잡한 문제도 효과적으로 해결할 수 있습니다.
'Programming' 카테고리의 다른 글
| C 컴파일 과정 (42) | 2025.08.23 |
|---|---|
| C 메모리 모델 심층 분석 (66) | 2025.08.22 |
| C 라이브러리와 헤더 파일 (58) | 2025.08.20 |
| C 전처리기 (47) | 2025.08.19 |
| C 구조체와 공용체 (60) | 2025.08.18 |