디버깅이란 무엇인가?
디버깅(Debugging)은 컴퓨터 프로그램에서 코드 오류를 찾아 수정하는 과정이다. 정보 기술(IT)과 공학에서 ‘버그(bug)’라는 단어는 ‘오류(error)’와 동의어로 사용된다. 디버깅의 목표는 오류의 근본 원인을 파악하고 이를 수정하는 것이다.
디버깅은 소프트웨어 개발 과정에서 중요한 역할을 한다. 아이러니하게도, 오류를 확인하고 버그를 제거하기 위한 테스트는 코드 작성만큼 많은 시간이 걸릴 수 있다. 디버깅 과정 자체는 오류의 원인을 찾아내고 이를 수정하는 작업으로 구성된다. 디버깅은 수동으로 또는 소프트웨어 디버깅 도구를 통해 자동화하여 수행할 수 있으며, 엔지니어들은 다음을 찾게 된다:
- 구문 오류
- 오타
- 논리적 오류
- 구현 오류
코드 디버깅 소프트웨어 도구에는 특정 프로그래밍 언어를 위한 소프트웨어 개발 키트(SDK) 지원, 오류 알림 기능 및 개발자가 특정 오류에 대한 정보를 더 자세히 조사할 수 있는 사용자 인터페이스(대시보드)가 포함된다.
테코피디아가 설명하는 디버깅
디버깅 과정에서는 소프트웨어 프로그램을 자주 컴파일하고 실행하여 문제를 식별하고 수정한다. 수백만 개의 소스 코드 라인을 포함하는 대형 소프트웨어 프로그램은 작은 구성 요소로 나누어져 효율적으로 디버깅된다. 처음에는 각 구성 요소가 별도로 디버깅된 후, 전체 프로그램이 디버깅된다. 일반적으로 디버깅이 어떻게 작동하는지는 선택된 글로벌 테스트 전략에 따라 달라진다.
디버깅 전략
디버깅 전략에는 여러 가지가 있다:
- 역추적(Backtracking) – 버그 헌터가 오류 징후가 발견된 지점에서 출발하여 실제 오류가 발생한 위치까지 소스 코드를 거꾸로 추적한다.
- 원인 제거 방법(Cause Elimination Method) – 소프트웨어 엔지니어가 오류의 잠재적 원인을 나열한 목록을 작성하고 테스트를 실행하여 실패 지점을 파악한다.
- 프로그램 슬라이싱(Program Slicing) – 품질 보증(QA) 테스터가 특정 조건 하에서 프로그램(슬라이스) 내 프로그램 문장 그룹을 실행한다.
- 샷건 디버깅(Shotgun Debugging) – 개발자의 추측을 바탕으로 한 시행착오 방식으로 디버깅을 진행하는 방법이다.
- 러버 덕 디버깅(Rubber Duck Debugging) – 프로그래머가 작은 고무 오리나 다른 무생물에 코드 한 줄 한 줄을 설명하는 방식이다. 이는 유연하고 논리적인 사고를 촉진하기 위한 방법이다.
- 페어 디버깅(Pair Debugging) – 무생물에 코드 한 줄 한 줄을 설명하는 대신, 개발자들이 번갈아 가며 코드 한 줄씩 서로에게 설명하는 방식이다.
디버깅의 중요성
디버깅은 코드 처리 및 소프트웨어 개발의 기본적인 부분이다. 전문가들은 디버깅을 “사람, 프로세스, 시스템”을 포함하는 과정으로 설명하며, 이는 기존 코드 베이스의 문제를 해결하는 데 도움이 된다.
이와 관련하여 가장 훌륭한 예가 바로 “역방향 디버깅(reverse debugging)”이라고 불리는 현대적 관행의 부상이다. 데브옵스(DevOps)와 애자일 소프트웨어 개발 시대에 역방향 디버깅은 프로그램을 모니터링하고 데이터를 특정 방식으로 제공하여 디버깅 과정을 자동화하는 데 사용된다. 이는 과거 개별 컴퓨터 과학자들이 기술적 탐정 작업과 유사한 과정을 통해 수동으로 진행했던 방식이었다.
과거에는 프로그래머들이 테스트를 하는 과정에서 기능상의 버그를 발견하면 개별 티켓을 제출하고, 코드를 수동으로 뒤져가며 문제가 무엇인지 파악했다. 이 과정에서 코드가 복잡하거나 버그가 테스트에서 잘 드러나지 않아 숙련된 팀 조차도 “궁지에 몰리는” 상황도 자주 일어났다.
이와는 대조적으로, 역방향 디버깅 시스템은 비행기의 비행 기록 장치처럼 프로그램을 실행 중에 추적하거나 프로그램을 모니터링하여 디버깅을 더 자동화할 수 있는 정보를 제공한다.
디버깅 자동화
자동화된 디버깅 도구는 개발자가 오류를 처리하는 과정을 단순화하고, 오타나 문법 또는 논리 상의 오류를 수정하는 데 걸리는 시간을 줄이는 데 도움을 줄 수 있다.
이러한 품질 보증(QA) 도구는 예외가 발생했을 때 이를 포착하고 개발자에게 오류 해결을 용이하게 하기 위한 진단 및 상황 별 데이터를 제공한다. 일부 자동화된 디버깅 도구는 하드 코딩된 알고리즘을 사용하고, 다른 도구는 머신 러닝 엔진을 사용하여 다양한 유형의 오류와 오류 패턴을 식별한다.
개발 팀이 CI/CD, 즉 지속적 통합(Continuous Integration, CI) 및 지속적 배포(Continuous Delivery, CD)를 사용하는 경우, 디버깅은 개발 과정 중에 단위 테스트(unit tests)에서 자동으로 수행되거나, 코드 변경 사항을 제한된 수의 최종 사용자에게 배포하는 카나리 테스트(canary tests)를 통해 수행될 수 있다.
디버깅 도구
달빅 디버그 모니터 서비스(Dalvik Debug Monitor Service, DDMS)는 안드로이드 플랫폼에서 사용되는 디버깅 도구다. 달빅 디버그 모니터 서비스는 안드로이드 SDK의 일부로 다운로드된다. DDMS에서 제공하는 기능으로는 포트 포워딩, 장치 내 화면 캡처, 장치 내 스레드 및 힙 모니터링, 무선 상태 정보 등이 있다.
달빅 디버그 모니터 서비스는 개발자가 에뮬레이터나 실제 안드로이드 장치에서 실행 중인 애플리케이션의 버그를 찾아낼 수 있게 도와준다. 예를 들어, DDMS의 로그캣(LogCat) 기능을 사용하면 개발자는 애플리케이션과 기기의 상태에 대한 로그 메시지를 확인할 수 있다. LogCat은 오류가 발생한 정확한 줄 번호도 찾아낼 수 있다.
또 다른 DDMS 기능인 에뮬레이터 제어(Emulator Control)는 개발자가 전화 상태와 활동을 시뮬레이션할 수 있도록 한다. 예를 들어, 속도나 지연 시간과 같은 다른 네트워크 특성을 가질 수 있는 GPRS, EDGE, UTMS 등 다양한 유형의 네트워크를 시뮬레이션해볼 수 있다.
이 외에도 달빅 디버그 모니터 서비스는 LogCat, 프로세스, 무선 상태 정보, 수신 전화, SMS, 위치 데이터 스푸핑 등의 기능을 제공한다. 이 디버깅 도구는 ADT(Android Development Tools) 플러그인을 추가하여 Eclipse IDE에 통합할 수 있으며, 그렇지 않으면 명령 줄에서 접근하여 실행 중인 에뮬레이터에 자동으로 연결된다.
그 밖에 인기 있는 디버깅 앱은 다음과 같다.
크롬 데브툴(Chrome DevTools)은 구글 크롬에 내장된 저작, 디버깅, 프로파일링 도구 세트이다.
퓨전 리액터(Fusion Reactor)는 자바와 콜드퓨전용 연속 모니터링 및 실시간 디버깅 도구이다. 이 도구를 사용하면 소프트웨어 엔지니어들이 코드를 계속해서 컴파일하지 않고도 API 호출과 작은 코드 단위를 상호 참조할 수 있다.
GDB(The GNU Debugger)는 명령줄에서 실행되며 C, C++, 포트란, 모듈라-A로 작성된 프로그램을 디버깅하는 데 사용할 수 있다.
인터랙티브 디스어셈블러(IDA)는 소프트웨어 엔지니어들이 기계 실행 가능 코드를 역으로 엔지니어링하여 어셈블리 언어로 변환할 수 있도록 해준다.
라이트런(Lightrun)은 개발자들이 마이크로서비스, 쿠버네티스, 도커 스웜, 아마존 웹 서비스에 대한 테스트와 진단을 실행할 수 있도록 해주는 서버 측 디버거이다.