나무모에 미러 (일반/어두운 화면)
최근 수정 시각 : 2025-03-01 11:09:43

디버거


1. 개요2. 구조
2.1. 기능
3. 종류
3.1. 백엔드와 프런트엔드
4. 목록
4.1. 백엔드4.2. 프런트엔드
5. 관련 문서

1. 개요

소프트웨어 개발자가 임의의 소프트웨어에서 버그를 쉽게 찾도록 디버깅을 도와주는 개발자 도구.

개발 중인 소스의 버그를 찾는 용도 외에도 이미 존재하는 프로그램의 분석 및 리버스 엔지니어링을 위해 사용되기도 하며, 따라서 컴파일 언어의 경우 디컴파일러의 용도와 겹치거나 디컴파일러 기능을 내장하고 있기도 한다.

2. 구조

2.1. 기능

3. 종류

3.1. 백엔드와 프런트엔드

디버거라는 것이 언어마다 구현 방법이 천차만별이지만, 안 그래도 복잡한 디버깅 효율을 최대한으로 끌어올리려면 GUI로 현재 중단점, 컨텍스트 트리, 호출 스택, 메모리 뷰 등 다양한 정보를 IDE에 시각적으로 통합(integration)해 보여 줄 필요가 있다. 이렇게 되면 [math(N)]개의 IDE마다 [math(M)]개의 언어별로 일일히 디버깅 지원을 추가해야 하는데, 총 [math(N\times M)]개의 디버깅 지원을 구현한다는 것은 개발자의 관점에서 결코 좋은 설계가 아니다.

따라서 보통의 경우 컴파일러나 언어 서버의 백엔드와 프런트엔드를 분리하듯이, 개별 언어별로 추상적인 디버거 백엔드를 한 번만 만들고 개별 IDE 제조사들은 Debug Adapter Protocol 등으로 이 둘을 통합해 재사용성을 높이는 방식의 설계를 사용한다. 실제로 대부분의 IDE가 자체 디버거를 내장한 것 같아도 백엔드로 gdb 등이나 다른 외부 디버거를 라이브러리 형태로 링크하고 있는 경우가 많다.

디버거 백엔드를 단지 라이브러리로 링크하는 것뿐 아니라 디버거를 별도 프로세스로 실행하고 프런트엔드(IDE) 역시 실행해 프로세스간 통신 또는 OSI L7 수준의 프로토콜로 통신하는 식의 구현도 늘어나자 디버거 백엔드-프런트엔드라는 용어 대신 디버거 서버-클라이언트 등의 용어도 사용되는 편.

이러한 구조적 분리로 인해 얻는 부가적 혜택 중 또 하나는 remote debugging 지원으로, SSH 등을 통해 서버에 원격 개발 환경을 구축한 경우 서버에서 빌드된 아티팩트를 유저 환경까지 매번 복사해 가져와서 디버거를 실행할 필요가 없어진다. 굳이 필요한가 의문이 들 수 있지만, 예를 들어 Windows에서 UNIX API를 사용하는 프로그램을 개발한다면 당연히 관련 디버깅 환경을 구축하는 데에도 많은 시간이 소모될 것이고, 원격 개발 환경을 사용한다면 이러한 문제를 피할 수 있다.

4. 목록

4.1. 백엔드

아래 항목들은 디버거 구현의 사실상 핵심을 담당하는 만큼 간단하지만 독립적인 프런트엔드를 내장하고 있어, 완제품(complete) 디버거를 겸하기도 한다. 따라서 흔히 디버거라고만 하면 아래 항목들만을 의미한다.

4.2. 프런트엔드

개별 IDE에 내장 및 플러그-인 되는 방식으로 구현된 프런트엔드. 흔히 '디버깅 지원', '디버거 지원', '디버거 플러그인' 등으로 불린다.

==# 기타 #==

5. 관련 문서