CS 기초/배열

[CS50] 디버깅

담크 2021. 8. 5. 14:40

저번 포스팅에서는 소스코드를 작성하고 실행하기 위한 컴파일링을 해줬는데 만약에 컴파일링을 할 때 코드의 오류가 있거나 결과가 우리 의도와 다를 땐 어떻게 해야 할까요?

이런 것을 '버그'라고 하는데 오늘은 버그를 효과적으로 찾고 그에 따른 해결방법에 대해 공부해보겠습니다.

 

이번 포스팅에서는 버그와 디버깅이라는 단어를 알면 본문 내용을 이해하기 쉬울 겁니다.

 

우선 버그(Bug)란?

소프트웨어가 예상하지 못한 잘못된 결과를 내거나, 오류가 발생하거나, 착오나 오작동이 발생하는 등의 문제를 뜻한다. 보통 프로그램의 소스코드나 설계 과정에서의 오류 때문에 발생한다. (출처: 위키백과)

 

디버깅(Debugging)이란?

디버그(Debug)라고도 하며 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적인 연산(버그)을 찾아내고 그 원인을 밝히고 수정하는 작업 과정을 뜻한다. (출처: 위키백과)

라고 합니다.

 

쉽게 말해 버그는 코드에 들어있는 오류, 디버깅은 코드에 있는 버그를 식별하고 고치는 과정이라고 생각하시면 됩니다.

많은 프로그래머들은 디버거라는 프로그램을 사용해서 디버깅을 하게 됩니다.

프로그램은 일반적으로 인간보다 빠른 연산을 수행하기 때문에 프로그램을 실행시켜보는 것으로는 버그를 찾기 힘듭니다. 그래서 디버거를 사용하는데 디버거는 프로그램을 특정 행에서 멈추게 할 수 있습니다. 이런 한 지점을 중지점이라고 하는데 프로그래머는 이 중지점을 기준으로 프로그램을 한 행씩 실행할 수 있게 도와줘 버그를 쉽게 찾을 수 있게 도와줍니다.

 

물론 디버거에도 많은 종류가 있습니다. 어떠한 디버거가 있는지 살펴봅시다.

 

help50

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

만약 이 코드를 컴파일하고 실행하면 어떻게 될까요?

이러한 에러가 발생하게 되는데 만약 이런 에러 메시지를 이해하기 힘들다면 help50 프로그램을 사용해보시면 됩니다.

help50은 컴파일하기 전 앞에 help50만 써주면 됩니다. 그러면 컴파일 시 생기는 오류를 해석해줍니다.

제 sandbox에선 네트워크 오류로 잘 잡히지 않아 수업내용중 일부를 가져왔습니다.

원인을 보자면 printf를 사용하기 위해서 stdio.h 라이브러리를 include 시켜야 한다는 내용을 가져옵니다.

이것만 보면 에러가 발생한 코드를 수정하기 쉽겠죠 ㅎㅎ

 

printf

하지만 코드상 에러가 아니라 사용자가 잘못된 코드를 작성할 경우는 이런 프로그램을 사용해서 해결할 수 없습니다.

예제를 보면

#include <stdio.h>

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

이러한 코드가 있다고 가정해봅시다. 사용자는 #이 10개만 출력되게 코드를 짰다고 합니다. 하지만 코드를 실행해보면 #이 총 11개가 나오게 됩니다. 물론 코드상 문제가 없으니까 에러도 발생하지 않았습니다.

이 경우는 디버깅의 다른 방법으로 변수를 직접 출력해서 확인해볼 수 있습니다.

#include <stdio.h>

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

실행 결과는

결과를 보고 i가 0부터 시작하기 때문에 조건식을 만족하려면 실제로 11번 결과가 출력된다는 사실을 알 수 있게 됩니다.

i = 1부터 시작하거나 i < 10으로 코드를 수정하면 의도대로 #이 10번 출력되겠죠

 

마지막으로 debug50입니다.

debug50은 CS50 IDE를 사용하면 사용할 수 있습니다.

(이런 기능은 CS50 IDE뿐 아니라 수많은 IDE에서 제공하는 기능입니다.)

그림과 같이 5줄 왼쪽에 빨간 점이 보이죠? 이걸 중지점(break point)라고 하는데요 보통 IDE왼쪽에 있는 행수를 클릭하면 됩니다. 이 기능은 보통처럼 프로그램이 진행되는 것이 아닌 여기서 멈춘 뒤 사용자가 한 단계씩 진행할 수 있도록 미리 말해주는 기능을 합니다.

이렇게 중지점을 찍은 다음 소스파일을 컴파일한 후 "debug50 파일명"으로 실행하면 위 사진의 오른쪽 패널의 기능을 사용할 수 있습니다. Ctrl + c를 눌러서 종료할 수 있습니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 배열' 카테고리의 다른 글

[CS50] 문자열의 활용  (0) 2021.08.09
[CS50] 문자열과 배열  (0) 2021.08.08
[CS50] 배열  (0) 2021.08.07
[CS50] 코드의 디자인  (0) 2021.08.06
[CS50] 컴파일링  (0) 2021.08.04