디버깅
모든 소프트웨어에서 소스코드의 오류 또는 버그를 찾아서 수정하는 과정
- 구문오류: 잘못된 명령문이 있는 오류, 프로그램이 컴파일되고나 실행되지 않음
- 의미론적 오류 : 명령문을 잘못사용( x/(2 π)라는 표현식을 Python으로 변환하는 경우 y = x / 2 * math.pi 하지만 곱셈과 나눗셈은 Python에서 동일한 우선 순위를 가지며, 왼쪽에서 오른쪽으로 계산되기 때문에 이 문은 올바르지 않습니다. 따라서 이 표현식이 (xπ)/2로 계산되어 버그가 발생합니다.)
- 논리 오류: 단계적 프로세스나 알고리즘을 잘못 입력할 때 발생, 코드에서 일찍 루프가 종료되거나 잘못된 if-then 결과가 있을 수 있음
- 런타임 오류: 소프트웨어 코드가 실행되는 컴퓨터 프로그램의 단계적 프로세스나 알고리즘이 잘못입력할때 발생, 메모리 공간부족 또는 스택오버플로우. try-catch블록의 명령문을 둘러싸거나 적절한 메시지로 예외를 로깅하여 런타임 오류해결할 수 있음
일반적인 디버깅 전략
- 점진적 프로그램 개발
- 역추적
- 원격 디버깅
- 로깅
- 클라우드 디버깅
LOG
Log.v(String tag, String msg)
: Verbose - 매우 낮은 우선순위의 로그 메시지에 사용됩니다.
Log.d(String tag, String msg)
: Debug - 디버깅 목적으로 사용됩니다.
Log.i(String tag, String msg)
: Info - 일반적인 정보를 나타내기 위해 사용됩니다.
Log.w(String tag, String msg)
: Warn - 경고나 예상치 못한 상황을 나타낼 때 사용됩니다.
Log.e(String tag, String msg)
: Error - 심각한 오류를 보고할 때 사용됩니다.
Log.wtf(String tag, String msg)
: What a Terrible Failure - 심각한 오류가 아닌 경우에도 시스템이 죽어버릴 정도로 심각한 상황을 나타낼 때 사용됩니다.
안드로이드 에서 발생하는 버그
Syntax Error
- 코틀린 문법 오류, Android API의 Method 이름, 리소스 명, 오타등등 미리 정의되지 않은 구문을 사용할때 발생한다.
- Android Studio 코드 편집 화면에서 빨간줄로 표시된다.
- 대부분 컴파일 과정에서 빌드 에러가 발생 한다.
- Build Output 창에서 에러 발생 위치 확인 후 수정한다.
Runtime Error
- 컴파일은 정상이고 앱도 실행되지만 앱 구동중에 발생하는 에러다.
- 앱 구동중 메모리 부족이나 배열의 잘못 된 주소값 할당, 객체의 생성자가 실행되지도 않았는데 객체를 사용하려고 할 때, 특정 뷰(View)를 사용할 때에는 그에 맞는 id를 지정해주어야 하는데 그렇지 못 할 경우 등등.. 너무나 다양함.
- 이 에러가 발생하면 폰의 앱 구동화면에 아래와 같이 표시됨.
Logical Error
- 소스 코드 컴파일도 정상적으로 되고 런타임상 에러가 발생하는 것도 아닌 개발자의 의도와는 다르게 동작하는 에러를 뜻한다.
- 버튼을 클릭하면 팝업이 뜨게 만들었으나 팝업이 아닌 새로운 페이지가 뜨거나 아무 동작을 안하거나 하는 것처럼 시스템상 프로그램이 멈추거나 하지는 않지만, 의도와는 다르게 동작하는 것을 말한다.
디버깅모드
가장 먼저 코드의 특정 포인트에서 어떤 값이 들어가 있는지, 메소드는 잘 실행되고 있는지 등을 알기 위해 내가 확인하고 싶은 코드에 break point(중단점)를 걸어야 한다.
-
break point(중단점) 걸기
- 내가 확인하고 싶은 코드 줄에, 좌측 줄번호 옆을 클릭해 빨간색 포인트(break point)를 찍는다.
- 메서드에 break point를 찍으면, 다이아몬드로 찍히는데, 이를 사용하면 속도가 많이 느려진다고 한다. 그래서 메서드 내부에 포인트를 찍는 것을 추천
-
디버깅 모드로 실행하기
- break point 걸고 벌레 모양 아이콘 선택한다.
- 앱이 실행되고 break point가 걸려있는 코드가 실행 될 때 debug 탭이 자동으로 열린다.
-
디버깅 툴 아이콘 사용법
- Debug 탭에는 디버깅을 위한 여러 아이콘 버튼들이 있다.
Resume Program
다음 중단점이 있을 때까지 앱을 실행함
Show Execution Point
클릭하면 현재 진행 중인 코드로 이동
Step Over
break point에서 코드의 다음 줄로 이동
Step Into
메서드 호출 내에서 첫 번째 줄로 이동
Step Over 와의 차이점
- step over는 줄단위의 코드들에 대해 디버깅
- step into는 메서드 단위로 이동하도록
보통은 메소드 안으로 들어가 step over로 디버깅하다가, 메서드를 디버깅하기 위해 step into 하면 된다.
Force Step Into
Settings의 "Debugger"옵션의 "Stepping"에 들어가면 "Do not step into the classes" 항목이 있다.
Step Into의 경우 이 항목을 스킵하면서 디버깅을 실행하는데, 이와 다르게 Force Step Into는 모든 코드를 거치면서 디버깅을 하는 모드이다
Step Out
Step into 와 반대로, 현재 메서드 외부에서 다음 줄로 이동
Run to Cursor
디버깅을 하는 중에 커서가 있는 곳으로 바로 이동해서 디버깅을 진행할 수 있다
Evaluate Expression
break point로 captured 된 변수를 이용해 expression 또는 함수 등을 실행할 수 있다.
디버그 모드로 변수값 변경하기
set value 를 통해 직접 변수 값을 변경할 수 있다.
Variables 탭 내에서 원하는 변수를 선택 후, 우 클릭하면 Set Value 를 클릭해 직접 변경할 수 있다.
디버그 모드로 로그 출력하기
Shift + 원하는 줄 선택(break point 찍듯이)하면 설정 팝업이 뜬다.
Log 부분에 Evaluate and log 체크박스에 체크하고, 해당 줄이 실행될 때 출력할 로그를 작성한다.