2021. 1. 29. 01:13ㆍ컴퓨터과학/cs50
Grace Hopper라는 아주 유명한 컴퓨터 과학자가 수년 전 동료들과 함께 Mark 2시스템이라는 것을 만들며 작성한 노트이다. Harvard Science Center에 가보면 건물 1층에 아주 큰 기계가 있을 텐데 그게 Mark1이다.
Mark2는 말 그대로 벌레가 안에 들어가 작동에 문제를 겪었다. 그건 나방이였다!!
Grace Hopper는 이를 기록하며 벌레(bug)가 발견된 첫 사례라고 적었다.
물론 이전에도 사람들이 어떤 시스템의 문제를 가리켜 버그라는 표현을 사용했지만, 이게 바로 컴퓨터 과학자들 사이에서 전해 내려오는 최초의 버그이다!
즉 버그는 우리가 의도하지 않은 프로그램 내 실수를 뜻한다.
Help50은 CS50이 제공하는 도구 중 하나다
CS50 샌드박스를 연다! (visual studio같은 ide툴인듯)
IDE는 통합 개발 환경의 줄임말로 Eclipse, Visual Studio, NetBeans 같은 것들을 말한다.
버그와 디버깅
버그(bug)는 코드에 들어있는 오류입니다. 버그로 인해 프로그램의 실행에 실패하거나 프로그래머가 원하는 대로 동작하지 않게 됩니다. 버그를 만들고 싶지 않겠지만 모든 프로그래머들은 버그와 마주하게 되어있습니다. 디버깅(debugging)은 코드에 있는 버그를 식별하고 고치는 과정입니다. 프로그래머는 디버거라고 불리는 프로그램을 사용하여 디버깅을 하게 됩니다.
디버깅의 기본
프로그램은 일반적으로 인간보다 훨씬 빠르게 연산을 수행합니다. 그래서 프로그램을 실행시켜보는 것만으로는 무엇이 잘못됐는지 찾아내기 어렵습니다. 디버거는 프로그램을 특정 행에서 멈출 수 있게 해주기 때문에 버그를 찾는데 도움이 됩니다. 프로그래머는 멈춰진 그 지점에서 무슨 일이 일어나는지 볼 수 있습니다. 프로그램이 멈추는 특정 지점을 중지점이라고 합니다. 또한 프로그래머가 프로그램을 한번에 한 행씩 실행할 수 있게 해줍니다. 이로써 프로그래머는 프로그램이 내리는 모든 결정들을 단계별로 따라갈 수 있게 됩니다.
*** 여기서는 cs50 sandbox라는 IDE툴을 가지고 설명을 합니다 ***
make 프로그램을 이용하여 컴파일해보면 "implicitly declaring library function 'printf'"라는 에러 메시지가 나타난다.
이런 에러 메시지를 이해하기 힘들다면, help50 프로그램을 사용하자
아래와 같이 make 앞에 help50을 붙여서 실행하면 다시 컴파일시 생기는 오류를 해석해준다.
문제의 원인은 printf 함수를 사용하기 위해서 stdio.h 라이브러리를 포함해야 한다는 것.
printf
이렇게 프로그램을 사용해서 해결할 수 없는 문제도 있다! printf를 출력해서 debug해보기!
아래 코드는 #을 10개 출력하기 위해 작성한 것
이 코드를 컴파일하고 실행해보면 에러는 발생하지 않지만, 우리 의도와 다르게 #이 11개나 출력되는 것을 확인가능하다. 그 이유는? 디버깅의 다른 방법으로 직접 의심이 가는 변수를 출력해서 확인해 볼 수 있다.
아래와 같이 변수 i를 출력해보자
그 결과 i가 0에서 시작하기 때문에 for 루프의 i<=10이라는 조건은 실제로 11번 만족한다는 사실을 알 수 있다.
따라서 이를 i<10으로 수정해주면 우리 의도대로 #이 10번 출력된다.
debug50
cs50 IDE를 사용하면 debug50이라는 프로그램도 사용할 수 있다.
아래와 같이 소스 코드에 직접 브레이크포인트를 지정하고 소스파일을 컴파일한 후에 “debug50 파일명” 으로 실행하면, 오른쪽 패널을 통해 변수의 값을 확인하거나 브레이크포인트부터 한 줄씩 코드를 실행해 볼 수 있습니다.
디버깅 종료를 위해서는 Ctrl + c를 누르면 됩니다.
GDB사용해보기
GDB는 자주 쓰이는 디버거 중 하나다. C프로그램에 GDB를 실행시키려면 먼저 프로그램을 컴파일해야한다.
그런다음, 보통 때처럼 "./프로그램_이름"을 치지 말고, "gdb프로그램_이름"을 친다!
GDB가 열리면, 가장 먼저 해야할 일은 중지점을 설정하는 것이다. 어디에서 프로그램이 잘못되는지 짐작이 간다면, 그 지점 이전에 있는 행에 중지점을 설정하는 것이 좋다! 어디가 문제인지 확실하지 않다면, 처음부터 모든 코드를 살펴볼 수 있도록 여러분의 main함수의 첫 행에 중지점을 설정해도 괜찮습니다.
중지점을 설정하기 위해서는 프로그램을 멈추고 싶은 행 번호 다음에 'b'를 치고 (breakpoint를 의미) 엔터 키를 누른다. 이렇게 하면 여러분 프로그램에 중지점이 설정될 거다! 현재의 모든 중지점을 보고 싶다면 "info b"를 치면 모든 중지점의 위치를 보여줄 것이다. 중지점의 행 번호 다음에 "clear"를 치면 중지점을 제거할 수 있다.
중지점을 설정했다면, 'r' (run의 의미)로 프로그램을 실행한다. 우리들의 프로그램이 명령어 인자를 받는다면, 'r'다음에 인자들을 쓰세요. 프로그램이 실행될 것이고, 중지점에서 자동으로 멈출 거다! 중지점마다 프롬프트가 나타날거다!
이 때 몇 가지 옵션들이 있다.
현재 지점에서 프로그램의 변수값을 보고 싶다면 변수 이름 다음에 'p'를 입력한다. (print) "info locals" 명령어는 현재 모든 지역 변수값을 보여줄 것이다.
코드의 다음 행으로 나아가고 싶다면 'n'을 입력한다 (next). 's' (step)을 쳐도 코드의 다음 행으로 가기는 하지만, 함수 내부로 들어가서 함수 내부의 각 행을 훝을 것이다.
프로그램을 계속 실행하고 싶다면 'c'를 입력해야한다 (continue). 중지점이 없다면 프로그램은 종료할 것이다.
중지점이 있다면, GDB는 다음 중지점에서 멈출 거다!
'컴퓨터과학 > cs50' 카테고리의 다른 글
[컴퓨터 과학 cs50] 문자열 길이는 어떻게 찾을 수 있을까?! ASCII에서 함수쓰기까지~ (0) | 2021.01.30 |
---|---|
[컴퓨터 과학 cs50] 문자열은 배열에 어떻게 저장될까? (0) | 2021.01.30 |
[컴퓨터 과학 cs50] 배열(2) 좀 더 동적으로 만들 순 없을까? (0) | 2021.01.29 |
[컴퓨터 과학 cs50] 배열(1)-변수는 컴퓨터에 어떻게 저장될까? (0) | 2021.01.29 |
[컴퓨터 과학 cs50] c언어의 동작원리는 어떻게 될까? 컴파일링과 어셈블링 링킹에 대해서! (0) | 2021.01.28 |