본문 바로가기
Programming

C 디버깅과 오류 처리

by 나무수피아는 지식의 가지를 뻗어가는 공간입니다. 2025. 8. 21.
반응형

디버깅과 오류 처리

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