버그와 디버깅
버그$_{bug}$는 코드에 포함된 오류로 프로그램이 제대로 실행되지 않거나 의도한 대로 동작하지 않게 만든다.
모든 프로그래머들은 버그와 마주하게 된다.
디버깅$_{debugging}$은 프로그램의 각종 버그를 식별하고 수정하는 과정이다.
프로그래머들은 디버거라는 프로그램을 사용해 디버깅을 수행한다.
디버깅의 기본
프로그램은 일반적으로 인간보다 훨씬 빠르게 연산을 수행한다. 그래서 프로그램을 실행시키는 것만으로는 무엇이 잘못되었는지 찾기 어렵다.
디버거는 프로그램을 특정 행에서 멈추게 할 수 있어 버그를 찾는 데 도움이 된다.
프로그래머는 중지된 지점에서 무슨 일이 일어나는지 확인할 수 있다.
프로그램이 멈추는 특정 지점을 중지점$_{breakpoint}$이라고 한다.
디버거는 프로그래머가 프로그램을 한 행씩 실행$_{step \space through}$할 수 있게 해준다.
이를 통해 프로그램이 내리는 모든 결정들을 단계별로 따라갈 수 있다.
help50
아래 코드를 컴파일하고 실행해보자.
int main(void)
{
printf("hello, world\\n");
}
make
프로그램을 이용해 컴파일하면 “implicitly declaring library function 'printf'”라는 에러 메시지가 나타난다.
에러 메시지를 이해하기 힘들다면 help50
프로그램을 사용해보자.
아래와 같이 make
앞에 help50
을 붙여서 실행하면, 다시 컴파일 시 발생하는 오류를 해석해준다.
help50 make 파일이름
프로그램을 통해 문제의 원인은 printf
함수를 사용하기 위해 stdio.h
라이브러리를 포함해야 한다는 것을 알 수 있다.
printf
하지만 프로그램을 사용해도 해결할 수 없는 문제도 있다. 아래 코드는 #
을 10개 출력하기 위해 작성한 것이다.
#include <stdio.h>
int main(void)
{
for (int i = 0; i <= 10; i++)
{
printf("#\\n");
}
}
이 코드를 컴파일하고 실행해보면 에러는 발생하지 않지만 의도와는 다르게 #
이 11개 출력된다.
그 이유는 i
가 0에서 시작하기 때문에 for
루프의 조건 i <= 10
이 11번 만족하기 때문이다.
이를 i < 10
으로 수정하면 의도대로 #
이 10번 출력된다.
디버깅의 다른 방법으로 의심되는 변수를 직접 출력해 확인할 수 있다.
다음은 변수 i
를 출력해 확인하는 예제이다.
#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
으로 수정하면 #
이 10번 출력된다.
debug50
CS50 IDE를 사용하면 debug50
이라는 프로그램도 사용할 수 있다.
소스 코드에 직접 브레이크포인트를 지정하고 소스 파일을 컴파일한 후에 debug50 파일명
으로 실행하면 오른쪽 패널을 통해 변수의 값을 확인하거나 브레이크포인트부터 한 줄씩 코드를 실행해 볼 수 있다.
디버깅을 종료하려면 Ctrl + C
를 누르면 된다.
References
'CSE > CS50' 카테고리의 다른 글
[CS50] 배열 - 배열(2) (1) | 2024.06.13 |
---|---|
[CS50] 배열 - 배열(1) (0) | 2024.06.13 |
[CS50] 배열 - 컴파일링 (1) | 2024.06.12 |
[CS50] C언어 - 하드웨어의 한계 (0) | 2024.06.12 |
[CS50] C언어 - 사용자 정의 함수, 중첩 루프 (0) | 2024.06.12 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!