디버거(영어: debugger) 또는 디버깅 도구(debugging tool)는 다른 대상 프로그램을 테스트하고 디버그하는 데 쓰이는 컴퓨터 프로그램이다. 검사받는 코드는 명령어 집합 시뮬레이터 (ISS: Instruction set simulator) 위에서 돌아감으로 인해 특정한 조건에서 멈출 수 있는 강점을 갖지만, 직접 프로세서에서 실행될 때 보다는 느려진다. 몇몇 디버거들은 이 효과를 제한하기 위해 동작의 두 가지 모드를 제공하는데, 전체 또는 부분적 시뮬레이션이 그것이다.
소프트웨어 버그나 유효하지 않은 값에 의해서 프로그램이 정상적으로 진행되지 않는 것을 트랩이라고 한다. 소스 레벨 디버거 또는 심볼릭 디버거의 경우 프로그램이 트랩되거나 정해진 조건에 도달하면, 디버거는 원본 코드에서의 위치를 보여준다. 요즘에는 대부분의 통합 개발 환경에서 볼 수 있다. 만약 로우 레벨 디버거 또는 기계어 디버거라면 이것은 디스어셈블리에서의 위치를 보여준다.
특징
전형적인 디버거들은 자신의 고수준에서 쿼리 프로세스, 심볼 리졸버, 표현식 해석기 그리고 디버그 지원 인터페이스를 제공한다. 또한 프로그램을 차례로 실행하는 (single stepping 또는 프로그램 애니메이션), 멈추게 하는 (breaking) (브레이크포인트를 사용해서) 그리고 변수의 값을 추적하는 것 같은 좀 더 복잡한 함수들을 제공한다. 몇몇 디버거들은 실행 중인 프로그램의 상태를 수정하는 기능도 갖는다. 또한 논리적 에러나 충돌 시 다른 위치에서 실행을 계속할 수 있다.
버그를 제거하는 데 유용한 이 기능들은 또한 복사 방지, 디지털 권리 관리 그리고 다른 소프트웨어 보호를 회피하는 소프트웨어 크래킹 툴로서 사용되기도 한다. 특히 명령어 경로 길이 (Instruction path length)가 보이는 경우, 이것은 또한 일반 검사 툴, 성능 분석기로서 사용되는 경우도 있다.
대부분의 주류 디버깅 엔진들은 (gdb나 dbx 같은) 콘솔 기반의 명령 줄 인터페이스를 제공한다. 디버거 프론트 엔드는 디버거 엔진의 대중적인 확장들이다.
역디버깅
몇몇 디버거들은 역디버깅이라고 불리는 기능을 포함한다. 이러한 디버거들은 프로그램의 실행을 되돌리는 것을 가능케 한다. 다양한 디버거들이 이 기능을 포함한다. 마이크로소프트 비주얼 스튜디오 디버거는 C#, 비주얼 베이직, .NET 등에 대해서는 이 기능을 지원하지만, C++에 대해서는 지원하지 않는다. 물론 C, C++, 자바, 파이썬 등에 대한 역디버거도 존재한다. 역디버거는 특정한 종류의 문제에 매우 유용하지만 아직은 보편적으로 사용되고 있지 않다.
메모리 보호
디버거들은 또한 버퍼 오버플로 같은 저장소 침입을 피하기 위한 메모리 보호를 포함하기도 한다. 이것은 메모리가 메모리 "풀"에서 동적으로 할당되는 트랜잭션 처리 환경에서 매우 중요하다.
디버깅을 위한 하드웨어 지원
대부분의 현대 마이크로프로세서들은 적어도 한 개 이상의 디버깅을 쉽게 만들어 주는 특징을 자신의 프로세서 디자인에 갖고 있다.
포펙과 골드버그의 가상화 요구를 충족시키는 명령어 집합은 디버깅 되는 소프트웨어로서 같은 프로세서에서 돌아가는 디버거 소프트웨어를 작성하는 것을 쉽게 해준다. 이러한 CPU는 테스트 시에 프로그램의 내부 루프를 실행할 수 있다. 그리고 계속 디버거의 제어 아래에 남는다.
인 시스템 프로그래밍은 외부 하드웨어 디버거가 테스트 중에 시스템을 재프로그래밍하게 해준다. (예를 들면, 브레이크포인트 추가나 제거 같은) 이러한 ISP를 지원하는 많은 시스템들은 또한 다른 하드웨어 디버그 지원을 갖는다.
하드웨어는 주소 비교기, 데이터 값 비교기, 페이지 부재 하드웨어 같은 코드와 데이터 브레이크포인트를 지원한다.
디버거 프론트엔드
몇몇 유명한 디버거들은 단지 CLI로 구현된다. 개발자들은 GUI를 통해 더 쉽고 효율적인 디버깅을 고려한다. 이것은 시각적인 프론트-엔드의 이유이다. 대부분의 GUI 디버거 프론트-엔드가 특정한 디버거를 대상으로 삼는데 반해, 어떤 것들은 여러 CLI 디버거들을 대상으로 삼는다.