Today I Learned - Day 45 [디버그 하는 방법]
분명히 코드를 신나게 써 내려갔는데, 실 동작이 안된다.
분명히 알고리즘은 완벽한데 상공으로 솟구친다.
분명히 검토를 골백번(아님)은 했는데 밑으로 떨어진다.
모두 코딩을 하다 보면 자주 발생하는 현상이다.
아무리 구성을 잘 했다고 해도, 아무리 검토를 해봤다고 해도 버그가 없는 코드란 무안단물과도 같은 허상일 뿐이다.
그래도 이를 줄일 수 있는 수단은 있다. 무안단물은 신화 상의 존재지만, 버그 없는 코드는 이론 상 가능 한 것이다.
그렇다. 바로 디버그다.
디버그를 알아보자.
유니티에는 디버그를 할 수 있는 몇 가지 기능이 존재한다.
- Debug.Log를 비롯한 Debug 코드
- IDE 연동 중단점 기능
양쪽 모두 유용한 기능으로, 디버그를 할 때 매우 유용한 기능들이다.
그러나, 엄밀히 따지면 양쪽이 목표가 다르다.
각각 따로 알아보자.
Debug 코드
Debug.Log()로 대표되는 디버그 코드들은 작성된 코드의 시점에 콘솔창 알림을 표시하는 역할을 맡고 있다.
게임의 정상 작동 확인이나 임시 기능 구현 등 다양한 방면에서 사용되는데, 이름을 보면 알겠지만 원래 목적은 디버깅이다.
사실, 하술할 중단점과 비교하면 알려주는 내용이 코드 상에 명시된 내용 뿐이라서 디버깅을 할 때에는 보다 좀 못하다. 그 마저도 코더가 직접 데이터 형식을 짜야 하는 구조라서 수고가 더 들기까지 한다.
그렇다면 이 코드로 디버깅을 하기에는 부적합한 걸까.
그건 아니다. 아래에서 말하겠지만, '중단점'이라는 이름에 걸맞게, 중단점으로 디버깅 시에는 '게임이 멈춘다.' 때문에 연속적인 작동을 본다던지 하는 경우에는 중단점으로 확인하기가 매우 난감하다.
이 때 사용하는 것이 Debug.Log인 것이다.
다만, 유의하자. Debug 코드는 '코드를 수정하는 것'이기 때문에 작성할 때랑 지울 때, 2번의 컴파일이 진행된다.
코드가 많으면 많을 수록 디버깅이 느려진다는 것이다.
IDE 연동 중단점 기능
사용법은 간단하다.
저기 화면 중앙 위쪽에 보이는 Unity에 연결을 누르자.
그럼 이 창이 뜰텐데, 여기서 왼쪽이나 중앙을 누르면 된다.
- 왼쪽: 이번 실행 동안에만 허용
- 중앙: 이번 프로젝트 동안 허용
- 오른쪽: 취소
이후, 특정 라인의 왼쪽 흰 선을 클릭하거나 라인에서 F9를 누르면 저런 빨간 원이 표시되면서 라인이 붉은 바탕이 되는데, 이 상태에서 유니티에서 Play를 시작하면 해당 라인이 실행되기 직전에 멈춘다.
이 때 제공되는 다양한 정보들을 바탕으로 현상을 분석, 해결하는 방식이다.
※ 만약, 빨간 점에 에러가 난다면, 연결을 한번 끊었다가 다시 연결해 보자.
이 때 볼 수 있는 정보는 다음과 같다.[사진은 잠시 누른 이후이기 때문에 해당 정보는 없다.]
- 화면 출력창 대신 나오는 각 변수 별 소지 값 목록.
- 로컨 편수와 조사식(원하는 변수 검색)을 볼 수 있다.
- 상술한 화면 오른쪽의 함수 호출 스택.
- 어떤 함수가 호출되고 있는지를 확인할 수 있다.
- 함수가 종료된 이후에는 해당 함수는 목록에서 제거된다.
- 코드 위에 마우스를 올리면 볼 수 있는 변수가 가지고 있는 값.
- '올려야' 한다는 점에 주의. 클릭 하면 못본다.
- 이 정보는 핀셋으로 고정시킬 수도 있다.
- 함수 호출 스택 하단에 보면 '직접 실행창'을 이용하면 변수의 값을 직접 변경할 수도 있다.
즉, 디버깅에 필요한 정보는 어지간하면 다 볼 수 있다.
그리고 다음 방식으로 코드를 진행 시킬 수 있다.
- F10: 해당 라인을 실행하고 코드 상의 다음 라인으로 넘어감.
- F11: 해당 라인을 실행하고 기능 상의 다음 라인으로 넘어감.
- 이 상태에서 Shift + F11으로 코드 상의 다음 라인으로 되돌아갈 수도 있다.
- F5: 다음 BreakPoint 까지 진행한다.
이러한 기능들을 이용해서 각 시점에서의 코드 변화를 확인하고 문제점을 발견하는 방식이다.
이렇게만 보면 중단점을 이용한 디버깅이 압도적으로 좋다고 생각할 수도 있다.
다만, Debug 코드에서 설명했듯이, 이렇게 하면 '게임이 중단된다'는 점이 난점.
현상과 비교하면서 확인하려고 한다면 게임이 멈추기 때문에 다소 난감해진다.
물론, 못 쓰는 것은 아니긴 하나, 이럴 때에는 Debug.Log로 확인하는 것이 더 편하기도 한다.
디버그는 코딩에서 가장 중요한 영역 중 하나다.
기능을 아무리 세세하게, 섬세하게, 훌륭하게 작성했다고 해도 버그로 인해서 기능이 먹통이 되면 기껏 제작한 코드가 의미가 없게 되는 셈이니 말이다.
급할 수록 돌아가라는 말이 있다.
돌아서 가자. 우리가 저지른, 그 실수들을 볼 수 있도록.