본문 바로가기

Computer Science/Computational thinking

컴퓨팅 사고 | 디버깅

✔ 학습목표

디버깅하는 여러 방법을 설명할 수 있다.

 

 

버그와 디버깅

버그(bug)는 코드에 들어있는 오류를 말한다. 코드에 있는 버그를 식별하고 고치는 과정이 디버깅(debugging)이다. 프로그래머는 디버거라 불리는 프로그램을 사용해서 디버깅을 한다.

 

디버깅의 기본

프로그램은 일반적으로 인간보다 훨씬 빠르게 연산을 수행하기 때문에, 프로그램을 실행시켜보는 것만으로는 무엇이 잘못됐는지 찾기 어렵다. 그래서 디버거를 사용한다. 디버거는 프로그램을 특정 행에서 멈출 수 있게 해 주기 때문에 버그를 찾는데 도움이 된다(이때 프로그램이 멈추는 특정 지점을 중지점이라고 한다). 디버거를 사용해 프로그래머는 프로그램을 한 번에 한 행씩 실행할 수 있고, 프로그램이 내리는 모든 결정을 단계별로 따라갈 수 있다.

 

 

방법 1) help50

디버깅의 첫 번째 방법은 help50을 사용하는 것이다. 아래 간단한 예제를 보자.

 

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

이 예제를 make로 컴파일하면 “implicitly declaring library function 'printf'”라는 에러 메시지가 나타난다.

 

우리는 printf를 사용해봤기 때문에 stdio.h 라이브러리를 포함해야 한다는 것을 쉽게 알 수 있다. 하지만 익숙하지 않은 코드라면 이러한 에러 메시지를 이해하기 힘들 것이다. 이때 사용할 수 있는 것이 help50이다. help50은 아래처럼 컴파일 시 생기는 오류를 해석해준다.

 

CS50 Sandbox에서 help50프로그램 실행

 

방법 2) printf

프로그래밍을 하다 보면 help50으로도 해결되지 않는 문제가 있다. 이 때는 printf 함수를 사용한다.

 

#을 10개 출력하는 프로그램을 작성한다고 생각해보자.

 

#include <stdio.h>

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

이 코드를 컴파일 하고 실행해보면 버그는 생기지 않는다. 하지만 #이 원래 의도했던 대로 10개가 아닌, 11개가 출력된다. 이럴 때 문제를 해결할 수 있는 것이 printf 함수다.

 

#include <stdio.h>

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

의심 가는 변수 i로 새로운 코드를 추가한 모습이다. 프로그램을 다시 실행해보면 우리는 for 루프의 i <= 10이라는 조건이 실제로 11번 만족한다는 사실을 찾아낼 수 있다. 

 

 

방법 3) debug50

CS50 IDE를 사용하면 debug50이라는 프로그램도 사용할 수 있다.

 

위와 같이 소스 코드에 직접 브레이크 포인트를 지정하고(숫자 옆 클릭) 컴파일한 후 'debug50 파일명'으로 실행하면 오른쪽 패널을 통해 프로그램의 실행 과정을 확인할 수 있다. 패널에서는 변숫값의 변화를 확인하거나, 브레이크 포인트에서부터 한 줄씩 코드를 실행해볼 수 있다.

 

디버깅 종료를 위해서는 Ctrl+c를 누르면 된다.

 

 

방법 4) 고무 오리

사진 출처: Tolo

때로는 앞의 모든 방법이 디버깅에 큰 도움이 안 될 수도 있다. 이때는 한숨 돌리고 곰곰이 생각해보는 수밖에 없다. 유명한 방법이 '고무 오리(러버덕)'이다. 고무 오리와 같이 무언가를 앞에 두고 코드를 한 줄 한 줄 말로 설명하다 보면 미처 놓치고 있었던 오류를 찾아낼 수 있다는 것이다.

고무오리 갖고싶다🥺

 


 

이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.

 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org