[CS50] 디버깅

TIL

버그와 디버깅

코드를 작성하다 보면 의도와 다른 오류나 결과를 맞닥뜨리게 된다. 이를 "버그"라고 하는데, 버그를 효과적으로 찾고 해결하는 방법을 알아보자.

 

버그(bug)는 코드의 오류로, 프로그램 실행에 실패하거나 원하는 대로 동작하지 않게 만든다.

 

디버깅(debugging)은 코드의 버그를 식별하고 고치는 과정이다. 프로그래머는 디버거라는 프로그램을 사용하여 디버깅한다.

 

프로그램은 매우 빠르게 실행되므로, 실행만으로는 오류를 찾기 어렵다. 디버거는 프로그램을 특정 행에서 멈출 수 있게 해주며, 이 지점을 중지점(breakpoint)이라고 한다. 프로그램이 멈춘 후 무슨 일이 일어나는지 확인할 수 있다.

 

또한 디버거는 프로그램을 한 줄씩 실행할 수 있게 해주어 단계별로 동작을 추적할 수 있다.

 

디버깅 도구

help50

다음 코드를 컴파일해보자.

int main(void)
{
    printf("hello, world\n");
}

make로 컴파일하면 "implicitly declaring library function 'printf'" 에러가 발생한다.

 

에러 메시지가 이해하기 어렵다면 help50을 사용할 수 있다.

$ help50 make 파일이름

help50이 에러를 해석해주는데, 문제의 원인은 printf 함수를 사용하려면 stdio.h 라이브러리를 포함해야 한다는 것이다.

 

printf로 디버깅

프로그램으로 해결할 수 없는 문제도 있다.

 

다음 코드는 #을 10개 출력하려고 작성한 것이다.

#include <stdio.h>

int main(void)
{
    for (int i = 0; i <= 10; i++)
    {
        printf("#\n");
    }
}

컴파일하고 실행하면 에러는 없지만, #이 11개 출력된다.

 

이럴 때는 의심이 가는 변수를 직접 출력해 확인한다.

#include <stdio.h>

int main(void)
{
    for (int i = 0; i <= 10; i++)
    {
        printf("i is now %i: ", i);
        printf("#\n");
    }
}

변수 i를 출력해보면, i가 0에서 시작하므로 i <= 10 조건이 실제로 11번 만족한다는 것을 알 수 있다. 따라서 i < 10으로 수정하면 의도대로 10번 출력된다.

 

debug50

CS50 IDE에서는 debug50 프로그램을 사용할 수 있다.

 

소스 코드에 브레이크포인트를 지정하고 컴파일한 후 debug50 파일명으로 실행하면, 오른쪽 패널에서 변수 값을 확인하거나 한 줄씩 코드를 실행할 수 있다.

 

연습 문제

Q. 디버깅 프로그램은 어떤 경우에 더 큰 도움이 될까? 도구 없이 직접 디버깅해야 한다면 어떻게 코드를 작성하는 것이 좋을까?
디버깅 도구가 유용한 경우:

  • 복잡한 코드
  • 런타임 에러
  • 논리적 오류를 찾을 때

도구 없이 디버깅하는 방법:

  • 모듈화: 함수를 작게 나누어 테스트하기 쉽게
  • 로깅: printf로 중요한 변수 값 출력
  • 단위 테스트: 각 함수를 개별적으로 테스트
  • 명확한 변수명: 코드 가독성 향상
  • 주석: 코드 의도 명확히 기록

이를 통해 코드의 가독성과 유지보수성을 향상시키고 디버깅 오류를 줄일 수 있다.

'TIL' 카테고리의 다른 글

[CS50] 배열 - 문자열과 배열  (0) 2025.11.06
[CS50] 배열  (0) 2025.11.05
[CS50] 컴파일링  (0) 2025.11.05
[CS50] 하드웨어의 한계와 오버플로우  (0) 2025.11.05
[CS50] C 언어 - 사용자 정의 함수와 중첩루프  (0) 2025.11.05
'TIL' 카테고리의 다른 글
  • [CS50] 배열 - 문자열과 배열
  • [CS50] 배열
  • [CS50] 컴파일링
  • [CS50] 하드웨어의 한계와 오버플로우
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Trouble Shooting
    Next.js
    앱 라우터
    javascript
    바닐라 자바스크립트
    함수 타입
    인터페이스
    typescript
    react
    App Router
    배열
    emotion diary
    Spa
    generic
    CS
    algorithm
    클래스
    알고리즘
    타입 좁히기
    Pages Router
    ai 감성 일기장
    자료구조
    트러블 슈팅
    C
    페이지 라우터
    문자열
    cs50
    memory
    제네릭
    useState
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[CS50] 디버깅
상단으로

티스토리툴바