본문 바로가기

Programming/C

Visual studio 디버깅 하는법

반응형

오늘은 이전에 설치한 visual studio에서 디버깅 하는 방법에 대해서 알아보자.

(아직 visual studio 설치를 하지 않았다면 http://computersource.tistory.com/54)


디버깅(Debugging)이란 컴퓨터 프로그램의 잘못을 찾아내고 고치는 작업이다. 



위의 뜻에 보다시피 debugging은 "벌레를 없애는 것" 이라고 해석을 할 수 있겠다.

그렇다면, "벌레 = 프로그램의 오류" 라는 말인데, 어디서 이런 유래가 생겨나게 되었을까?



punch card(천공카드) 사진, 출처(위키피디아)

 

예전에는 위 사진과 같은 카드에 구멍을 뚫어서 데이터 값을 표현하고(구멍이 있다면 on/ 없다면 off식으로 binary값을 표현), 그 card를 컴퓨터 프로그램에 전달하는 식으로 컴퓨터가 동작하였다. 그렇게 프로그램을 돌리던 중, 결과값이 예상한 것과 다르게 나오게 되었는데, 이유를 찾아보니 구멍이 뚫린 부분에 나방(?)이 있어 그 구멍을 컴퓨터가 인식하지 못하다고 구멍이 뚫려 있지 않다고 인식하여 컴퓨터 프로그램에 오류가 생겼다고 한다. 그때부터 프로그램에 있는 오류를 "버그"라고 부르기 시작하였고, 그 "버그"를 없애는 작업을 "디버깅"이라고 부르기 시작하였다고 한다. 



우리가 앞으로 프로그램을 짜면서, 코드를 완성했다고 컴파일을 하는 순간 

우리가 접하는 것은 제대로 동작하는 프로그램이 아닌 수 많은 에러 메세지를 보게 될 것이다. 

피할 수 없다면 즐겨라 라는 말처럼 마냥 디버깅 과정을 즐길 수는 없겠지만 즐기도록 노력해보자.



프로그램에 있는 버그는 크게 3가지로 나뉜다.

1.컴파일 에러 2.런타임 에러 3.로직 에러

   


1) 컴파일 에러


컴파일 에러는 프로그램에 문법적인 오류가 있어서 컴파일이 되지 않는 경우이다.

10번째 줄, printf("finish") 다음에 세미콜론(;)을 붙여주지 않아 컴파일 에러가 났다. 

컴파일에러는 하단에 보이는 출력창에 debug_ex.c(12):error~~~ ';'이(가) 'return' 앞에 없습니다. 와 같이

친절하게 어디서 에러가 났는지 알려주기 때문에 가장 해결하기 쉬운 에러다. (12)가 12번째 줄에서 에러가 났다는

것을 의미한다. 10번째 줄에서 ;가 없이 끝나니 12번째 줄을 실행할 때 문제가 되었다는 뜻이다.





 2)런타임 에러

런타임 에러는 프로그램이 실행중에 프로그램이 비정상적으로 꺼지는 경우이다. 

이 경우, 컴파일러가 컴파일에러처럼 몇번 째 줄이 잘못되었다 라고 알려주지 않기에 

어디서 잘못되었는지 찾기가 생각보다 까다롭다. 프로그램이 커지면 커질수록 더욱 복잡해 진다. 


이런 경우에는 프로그램을 한 줄 씩 실행해 보면서 몇번 째 줄에서 문제가 되는지 찾아야 한다.

이 글을 쓰는 목적이 사실 이 부분을 설명하기 위함이다. 



다음과 같은 간단한 프로그램을 작성한다.



f10키를 누르면 다음과 같은 창이 뜬다. 검은색 화면은 프로그램의 결과를 보여 주는 콘솔실행화면이다. 

코드 왼쪽편에 보면 노란색 화살표가 생긴 것을 볼 수 있다.



f10키를 누를 때마다 코드 왼쪽에 생긴 화살표가 한 줄씩 아래로 이동하는 것을 볼 수 있다.

즉 f10키는 프로그램코드를 한 줄 씩 실행하는 키이다. 

f10키를 누르면, 화살표가 위치해 있던 줄의 코드를 실행한다.

(주의, 콘솔화면에 focus가 되어있으면 f10키가 반응하지 않는다. visual studio에 focus가 되어있어야 한다).


화살표가 위치해 있는 8번째 줄을 실행하기 전 콘솔화면에는 아무것도 출력되어 있지 않다.


f10을 누르면, printf가 실행되어 콘솔 화면에 a : 10 이라는 출력값이 출력된 것을 확인 할 수 있다.


중간에 디버깅을 종료하고 싶다면, shift+f5 을 눌러주면 된다.




<원하는 부분부터 디버깅 작업하기>

프로그램의 코드수가 길 때 처음부터 한 줄씩 실행하며 확인하는 것은 비효율적이다.

고로 다음과 같이, 마우스로 코드 왼쪽부분에(빨간 동그라미가 위치해 있는 곳 세로부분)

마우스 왼쪽버튼으로 클릭하면 다음과 같은 빨간 동그라미 부분이 생긴다.


f5번을 누르면, 우리가 설정한 부분까지 실행이 된 채 디버깅모드가 시작이 된다.

화살표가 빨간색 동그라미에 위치해 있는 모습을 볼 수 있다.



printf같은 "함수로의 이동"은 f11을 누르면 해당 함수로 이동하는 것을 볼 수 있다


printf의 함수 부분. 여기서의 탈출은 shift+f11번을 눌러주면 다시 돌아올 수 있다.


printf와 같은 라이브러리함수뿐만 아니라, 내가 만든 함수에도 똑같이 사용할 수 있다.




또한 디버깅모드에서 f10으로 한 줄씩 실행을 하다, for문과 같은 반목문을 만나게 되고, for문에서 문제가 없다는 것을 

확신할 때에, for문을 탈출하는 방법으로 똑같은 방법을 사용할 수 있다.


다음과 같이 for문 아래 부분에 마우스 클릭으로 빨간색 동그라미를 만든다.

참고로 빨간색 동그라미를 break point라고 한다. 



그런다음 f5 버튼을 누르면 break point로 이동하는 것을 볼 수 있다.



다음은 맨 하단부에 보이는 창에 대한 간략한 설명을 하자면, 자동으로 클릭이 되면 

있는 변수들을 알아서 잡아주고, 지역 같은 경우에는 현재 실행되어 있는 곳의 scope에 포함되는 변수들의

값을 추적할 수 있다. 

조사식 부분을 클릭하면, 내가 원하는 변수들을 입력하여 값을 추적할 수 있다.


다음과 같이 주소값까지 추적할 수 있다. 

또한 배열에 들어가 있는 값또한 추적할 수 있다.







또 하나의 추가 팁은, breaking point (빨간동그라미)에 마우스를 가져간 뒤 뒷버튼을 누르면

위와 같은 메뉴들이 나온다. 이 때, "조건(C)"를 클릭해보자.



그럼 위와 같이 파란색 네모 창이 새롭게 뜬 것을 볼 수 있다. 

우리가 주목해야 할 부분은 "예: x = =5"라고 적혀있는 부분이다. 이 부분에 우리가 원하는 조건을 넣으면

그 조건이 만족할 때만 break가 걸리게 할 수 있다.




for문에서 j 의 값이 3일 때만 break가 걸리게 조건을 적어준다.   





조건을 적어 준 뒤, enter를 누르면 위와 같이 "저장됨"이라는 메세지를 확인 할 수 있다.




그 뒤, f5를 눌러 실행시키면, 해당 breakpoint에서 멈춰 있을 것인데,

j의 값을 보면 3임을 확인 할 수 있을 것이다. (j가 1,2 일때는 break수행 안 함.)





3)로직 에러

로직 에러인 경우는 프로그램의 결과가 이상하게 나오는 경우이다.

예를 들어, 구구단을 출력해 주는 프로그램인데 사용자가 5단을 출력하길 원하는데

6단을 출력해 준다거나 하는 문제이다.

반응형