디버깅
모든 소프트웨어에서 소스 코드의 오류 또는 버그를 찾아서 수정하는 과정
디버깅이 필요한 코딩 오류
- 구문 오류: 컴퓨터 프로그램에 잘못 입력된 명령문이 있을 때 발생하는 버그. 워드 프로세싱의 오타 또는 철자 오류가 있다. 구문 오류가 있으면 프로그램이 컴파일되거나 실행 자체가 안되기 때문에 쉽게 찾을 수 있다
- 의미론적 오류: 프로그래밍 명령문을 잘못 사용할 때 발생. 예를 들어 프로그램의 사칙연산 우선순위를 생각하지 않고 수식을 짰을 때 잘못 계산된 값에 의해 오류가 날 수 있다
- 논리 오류: 프로그래머가 컴퓨터 프로그램의 단계적 프로세스나 알고리즘을 잘못 입력할 때 발생. 잘못된 if - when 결과가 이에 해당한다. 여러 가지 입력/출력 시나리오의 코드를 단계별로 살펴보면 논리 오류를 찾아낼 수 있다.
- 런타임 오류: 소프트웨어 코드가 실행되는 컴퓨팅 환경으로 인해 주로 발생한다. 메모리 공간 부족 또는 스택 오버플로등이 이유가 될 수 있다. try-catch 블록의 명령문을 둘러싸거나 적절한 메시지로 예외를 로깅하여 런타임 오류를 해결할 수 있다.
일반적인 디버깅 전략
- 점진적 개발: 코드의 작은 부분을 자주 테스트할 수 있도록, 관리가 용이한 섹션으로 나누어 프로그램을 개발하는 방식. 이렇게 함으로써, 프로그래머는 발견한 모든 버그를 현지화할 수 있다. 또한 코드의 큰 섹션을 작성한 후 여러 개의 오류를 해결하는 것이 아니라, 한 번에 하나의 버그만 해결할 수 있게 한다.
- 역추적: 특히 소규모 프로그램에서 널리 사용되는 디버깅 방식으로, 개발자는 치명적인 오류가 발생한 위치부터 역방향으로 작업하여, 코드에서 정확한 발생 지점을 찾을 수 있다. 코드 줄의 수가 증가할수록 실행하기가 어려워진다는 단점이 있다.
- 원격 디버깅: 로컬 시스템과 분리된 환경에서 실행되는 애플리케이션을 디버깅하는 것이다. 예를 들어 원격으로 설치된 디버깅 도구를 사용하여 버그를 해결할 수 있다.
- 로깅: 대부분의 컴퓨터 프로그램은 내부 데이터와 실행 시간 및 운영 체제 상태와 같은 기타 중요한 정보를 로그 파일에 기록하기 때문에, 개발자는 이 로그 파일을 조사하여 버그를 찾고 해결할 수 있다. 또한 로그 분석기와 같은 도구를 사용하여 로그 파일의 처리를 자동화할 수도 있다.
- 클라우드 디버깅: 개발자가 로컬 시스템에서 클라우드 아키텍처를 에뮬레이트해야 하기 때문에, 복잡한 클라우드 애플리케이션을 디버깅하기는 어렵다. 시간 경과에 따라, 클라우드 환경과 에뮬레이트 환경 간에 구성 차이가 발생할 수 있고, 이로 인해 프로덕션에서 버그가 증가하고 개발 주기가 길어진다. 보다 효율적인 클라우드 디버깅을 위해 특수한 도구가 필요할 수 있다.
안드로이드 앱 디버깅
코드에 로그 넣는 방법
- 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 이름, 리소스 명, 오타등등 미리 정의되지 않은 구문을 사용할때 발생한다.
- 런타임 에러: 앱 구동중에 발생하는 에러, 앱 구동중 메모리 부족이나 배열의 잘못 된 주소값 할당, 객체의 생성자가 실행되지도 않았는데 객체를 사용하려고 할 때, 특정 뷰(View)를 사용할 때에는 그에 맞는 id를 지정해주어야 하는데 그렇지 못 할 경우 등등.. 너무나 다양함
- 로그켓 화면에서 에러 위치 및 Exception 정보를 확인하고 수정한다.
- Logical Error: 소스 코드 컴파일도 정상적으로 되고 런타임상 에러가 발생하는 것도 아닌 개발자의 의도와는 다르게 동작하는 에러를 뜻한다. Logical Error를 해결하기 위해 아래에 있는 디버깅 모드를 사용한다
디버깅 모드 사용하기
- 중단점 걸기
- 디버깅 모드로 실행하기
- 디버깅 툴 아이콘 사용법