프로그래밍을 하다가 주변에 질문을 하게 되면 질문 받은 사람들은 주로 뭐라고 대답을 하나요?

전 주로 두 가지 답변을 합니다.

"소스 줘봐" 혹은 "디버깅 돌려"

첫 번째꺼야 그러려니 해도, 두 번째 이야기를 할 때 난관에 봉착하더군요. 디버깅을 어떻게 하냐던데..

그래서 디버깅에 대해 글을 한 번 써보기로 했습니다.

일단 디버깅이 뭘까요?

Wikipedia에서는 이렇게 설명을 합니다.

" 디버그(debug)는 컴퓨터 프로그램 상의 오류(버그)를 찾아내어 바로잡는 과정을 뜻한다. 디버깅(debugging)이라고도 한다. "

보통 프로그램을 디버깅하게 되는 이유는 논리적 오류(Logical error) 때문입니다.

오류에는 크게 2 종류가 있습니다.

문법적 오류(Syntax error) : 해당 언어의 문법에 적합하지 않아서 컴파일러가 번역을 못하는 경우 컴파일러는 Syntax Error를 많이 겪습니다. 컴파일 하기 전에 오류가 발생하는 경우는 이 경우입니다.

논리적 오류(Logical error) : 논리적으로 발생하는 오류입니다. 문법적으로는 문제가 없으나 실행해보면 문제가 생기는 경우죠. 다음과 같은 경우를 주로 이야기합니다.

int arr[10];

for(int i=0;i<12;i++)
{
	arr[i] = [i];
}

이 소스코드는 int 형 배열 arr[10]의 12번째 원소 arr[11]을 접근하면서 할당되지 않은 메모리 사용이나 범위를 벗어났다고 오류가 발생하게 됩니다. 이런건 간단한 예외(Exception)인데, 논리적 오류는 주로 다음과 같은 것을 일컬습니다.


int a = 0;

while(a < 100)
{
	a = 1;
}

 이 프로그램은 a += 1 을 하려고 했는데 a = 1 으로 한 논리적 오류로 해두겠습니다. 저번에 학생들 수업할 때 진짜 저런 학생이 있었어요. 어쨌든 저 프로그램은 메모리 오류가 나는 것도 아니고 문법적 오류가 있는 것도 아니지만(이클립스에선 잡기도 합니다. 이클립스는 똑똑해요..)  무한 루프에 빠지게 됩니다.

이 정도 소스코드면 딱 보면 누구나 에러를 찾을 수 있으나, 코드가 방대해지면 저와 같은 간단한 논지에서 찾을 수 있는 에러도 찾을 수 없습니다. 게다가 본인이 짠 코드에 대한 확신이 강한 사람은 프로그램이 방대해질 수록 초보적인 실수에 대해 자신은 그러지 않을거란 과신을 갖게 되고 확인을 하지 않게 되죠.

그렇다면 디버깅이란건 뭘까요?

사전적 정의는 위에 언급했고, 흔히 말하는 디버깅 해보라는 이야기는, IDE(Intergrated Development Environment, 통합개발환경)에서 제공해주는 디버거 툴(debugger tools)을 사용해서 디버깅을 진행해보라는 이야기입니다.

디버깅은 주로 소스코드를 인터프리트형식으로 실행하며 line by line으로 현재 메모리에 저장된 변수들의 값을  추적하고 루틴을 살펴보는 방식입니다.

그러면 300줄이면 300번 확인을 해야 하는건데 이런 귀찮은 일을 왜 해야 할까요? 시간 아깝게.

인터넷을 보거나, 주변 사람들을 보면 이런 허탈한 류의 이야기가 많습니다.

"내 코드가 이상해서 12시간동안 봤는데, 변수 하나를 할당을 잘못 해줬지 뭐야 아오 어이없어!"

"내 코드가 실행이 안되는거야. 그래서 봤는데 for문 옆에 세미콜론을 붙였어 3시간이나 보고 있었는데"

라던가.. 이런 류의 이야기들을 많이 보셨거나 들어보셨을 겁니다.

 이게 디버깅을 천천히 해봤으면 어디가 문제인지 쉽게 알 수 있는 일인데 디버깅을 안하면서 생기는 일일 경우가 많습니다. 디버깅은 선택이 아니라 필수적인 습관이라 생각하며 여러분에게 권장하고 싶습니다.

다음 글에서는 Visual Studio에서 디버깅하는 방법을 알아보겠습니다.
Posted by TY
,