C 언어 디버깅 : 버그 해결 + 디버깅 도구 활용
버그란 무엇인가?
버그(bug)는 코드에 포함된 오류를 의미한다. 버그가 발생하면 프로그램이 정상적으로 실행되지 않거나, 기대한 동작을 하지 않게 된다. 모든 프로그래머들은 버그를 피하고 싶겠지만, 현실적으로 완벽한 코드를 작성하는 것은 불가능하다. 따라서 프로그래머는 항상 버그와 마주할 수밖에 없다.
이러한 버그를 찾아 수정하는 과정을 디버깅(debugging)이라고 한다. 디버깅을 위해 프로그래머는 디버거(debugger)라고 불리는 도구를 사용하며, 이를 통해 코드의 실행을 분석하고 문제를 해결할 수 있다.
디버깅의 기본 개념
컴퓨터는 인간보다 훨씬 빠르게 연산을 수행하기 때문에, 코드가 실행되는 것만으로는 어디서 오류가 발생했는지 확인하기 어렵다. 이를 해결하기 위해 디버거는 특정 지점에서 프로그램을 멈추게 하고, 해당 시점에서 변수 값이나 프로그램의 상태를 확인할 수 있도록 해준다.
이처럼 프로그램을 특정 지점에서 멈추게 하는 것을 중지점(Breakpoint) 설정이라고 한다. 또한, 디버거는 프로그램을 한 줄씩 실행할 수 있도록 해주는데, 이를 통해 코드가 실행되는 과정을 단계별로 확인하며 오류를 찾을 수 있다.
help50을 활용한 디버깅
아래 코드를 컴파일하고 실행한다고 가정해보자.
int main(void)
{
printf("hello, world\n");
}
이 코드를 make 명령어를 사용해 컴파일하면 다음과 같은 오류 메시지가 나타날 수 있다.
implicitly declaring library function 'printf'
이 오류 메시지가 무슨 의미인지 알기 어렵다면, help50 프로그램을 사용해보자. help50은 컴파일 시 발생하는 오류 메시지를 보다 쉽게 이해할 수 있도록 설명해주는 도구다.
help50 make 파일이름
이 명령어를 실행하면 오류 메시지를 해석하여 해결 방법을 제시한다. 위의 경우, printf 함수를 사용하려면 #include <stdio.h>를 추가해야 한다는 점을 알려줄 것이다.
printf를 활용한 디버깅
때로는 프로그램이 오류 메시지를 출력하지 않더라도, 예상과 다르게 동작할 수 있다. 아래 코드를 보자.
#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가 0에서 시작하기 때문에 i <= 10 조건이 11번 만족하는 것을 확인할 수 있다. 따라서 루프 조건을 i < 10으로 변경해야 원하는 결과를 얻을 수 있다.
debug50을 활용한 디버깅
CS50 IDE를 사용한다면 debug50이라는 디버깅 도구를 활용할 수 있다. 이 도구를 사용하면 직접 소스 코드에 브레이크포인트(Breakpoint)를 설정하고, 프로그램 실행 중 특정 지점에서 멈출 수 있다.
사용법은 다음과 같다.
debug50 파일명
이렇게 실행하면, 오른쪽 패널에서 변수 값 등을 실시간으로 확인할 수 있으며, 한 줄씩 코드를 실행하며 디버깅을 진행할 수도 있다. 디버깅을 종료하려면 Ctrl + C를 입력하면 된다.
Ctrl + L의 기능
터미널에서 Ctrl + L을 입력하면 현재 화면이 깨끗하게 정리된다. 이는 clear 명령어와 같은 기능을 하며, 터미널 창을 정리하여 보다 깔끔한 환경에서 작업할 수 있도록 도와준다. 디버깅을 진행할 때 여러 출력값이 터미널을 어지럽히는 경우 Ctrl + L을 활용하면 유용하다.
디버깅 도구가 큰 도움이 되는 경우
- 프로그램이 복잡하여, 버그가 발생한 위치를 직접 찾기 어려울 때
- 특정한 입력 값에서만 발생하는 버그를 잡아야 할 때
- 실행 중 변수 값이 어떻게 변화하는지 확인해야 할 때
디버깅 도구 없이 직접 디버깅하는 방법
- 코드를 읽기 쉽게 작성하기: 들여쓰기와 변수명을 명확하게 지정하면, 문제를 쉽게 파악할 수 있다.
- 작은 단위로 실행해보기: 프로그램을 한꺼번에 실행하지 말고, 부분적으로 실행하며 문제를 찾는다.
- 출력문을 활용하기: printf 등을 사용해 변수 값을 출력하면, 프로그램이 어떻게 동작하는지 확인할 수 있다.
'IT' 카테고리의 다른 글
동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석 (0) | 2025.03.18 |
---|---|
C 언어 디버깅 & 코드 품질 향상: check50, style50, 배열 활용 가이드 (0) | 2025.03.17 |
C 언어 컴파일 과정 : 전처리, 컴파일, 어셈블, 링크 (0) | 2025.03.17 |
부동 소수점 오류와 오버플로우: 프로그래밍에서 주의할 점 (1) | 2025.03.16 |
C 프로그래밍: 사용자 정의 함수와 중첩 루프 (0) | 2025.03.16 |
댓글
이 글 공유하기
다른 글
-
동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석
동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석
2025.03.18 -
C 언어 디버깅 & 코드 품질 향상: check50, style50, 배열 활용 가이드
C 언어 디버깅 & 코드 품질 향상: check50, style50, 배열 활용 가이드
2025.03.17 -
C 언어 컴파일 과정 : 전처리, 컴파일, 어셈블, 링크
C 언어 컴파일 과정 : 전처리, 컴파일, 어셈블, 링크
2025.03.17 -
부동 소수점 오류와 오버플로우: 프로그래밍에서 주의할 점
부동 소수점 오류와 오버플로우: 프로그래밍에서 주의할 점
2025.03.16