디버거

**디버거**(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 디버거들을 대상으로 삼는다.
# 디버거 목록
Winpdb가 자신을 디버깅하는 모습. 소프트웨어 개발 프로세스 * AppPuncher 디버거 — - 리치 인터넷 애플리케이션 디버깅 * AQtime * CA/EZTEST — CICS 인터랙티브 테스트/디버그 소프트웨어 패키지 * CharmDebug — Charm++용 디버거 * 코드뷰 * DBG — PHP 디버거 및 프로파일러 * dbx * DDD (데이터 디스플레이 디버거) * 분산 디버깅 툴 (Allinea DDT) * DDTLite — Allinea DDTLite (비주얼 스튜디오 2008용) * DEBUG — DOS 및 마이크로소프트 윈도우에 기본 내장된 디버거 * 디버거 (MySQL용) * 오페라 드래곤플라이 * 다이내믹 디버깅 테크닉 (DDT), 및 옥털 디버깅 테크닉(Octal Debugging Technique) * 이클립스 * 임베디드 시스템 디버그 플러그인 포 이클립스(Embedded System Debug Plug-in for Eclipse) * 퓨전디버그 * gDEBugger OpenGL, OpenGL ES, OpenCL 디버거 및 프로파일러 * GNU 디버거 (GDB), GNU Binutils * HyperDBG - 하드웨어 보조 가상화를 이용한 커널 디버거 * 인텔 디버거 (IDB) * 인사이트 * 파라소프트 Insure++ * iSYSTEM — 인 서킷 디버거 (임베디드 시스템용) * 인터랙티브 디스어셈블러 (IDA 프로) * 자바 플랫폼 디버거 아키텍처 * 징크스(Jinx) — heisenbugs용 시스템 디버거. 장치 드라이버로 투명하게 동작. * JSwat — 오픈 소스 자바 디버거 * LLDB * 맥스버그(MacsBug) * Nemiver — 그놈용 그래픽 C/C++ 디버거 * OLIVER (CICS 인터랙티브 테스트/디버그) - GUI 방식의 명령어 집합 시뮬레이터 (ISS) * OllyDbg (올리디버거) * Omniscient Debugger — 자바용 디버거 (Forward and backward debugger for Java) * pydbg * IBM Rational Purify * 리얼뷰 디버거 — ARM이 설계하여 만든 상용 디버거 * sdb * SIMMON (시뮬레이션 모니터) * SIMON (배치 인터랙티브 테스트/디버그) — GUI 방식의 명령어 집합 시뮬레이터 (ISS), 일괄 처리용 * 소프트아이스(SoftICE) * 타임머신(TimeMachine) — 그린 힐스 소프트웨어가 만든 디버거(Forward and backward debugger) * 토털뷰(TotalView) * Lauterbach TRACE32 — 임베디드 시스템용 인 서킷 디버거 * 터보 디버거 * Ups — C, 포트란 소스 수준 디버거 * Valgrind * VB 워치 디버거 — 비주얼 베이직 6.0용 디버거 * 마이크로소프트 비주얼 스튜디오 디버거 * WinDbg * Xdebug — PHP 디버거 및 프로파일러 * frida - 모바일 후킹 및 디버거