A debugger or debugging tool is a computer program used to test and debug other programs (the "target" program). The main use of a debugger is to run the target program under controlled conditions that permit the programmer to track its execution and monitor changes in computer resources that may indicate malfunctioning code. Typical debugging facilities include the ability to run or halt the target program at specific points, display the contents of memory, CPU registers or storage devices (such as disk drives), and modify memory or register contents in order to enter selected test data that might be a cause of faulty program execution.

The code to be examined might alternatively be running on an instruction set simulator (ISS), a technique that allows great power in its ability to halt when specific conditions are encountered, but which will typically be somewhat slower than executing the code directly on the appropriate (or the same) processor. Some debuggers offer two modes of operation, full or partial simulation, to limit this impact.

A "trap" occurs when the program cannot normally continue because of a programming bug or invalid data. For example, the program might have tried to use an instruction not available on the current version of the CPU or attempted to access unavailable or protected memory. When the program "traps" or reaches a preset condition, the debugger typically shows the location in the original code if it is a source-level debugger or symbolic debugger, commonly now seen in integrated development environments. If it is a low-level debugger or a machine-language debugger it shows the line in the disassembly (unless it also has online access to the original source code and can display the appropriate section of code from the assembly or compilation).

Features
Typically, debuggers offer a query processor, a symbol resolver, an expression interpreter, and a debug support interface at its top level. Debuggers also offer more sophisticated functions such as running a program step by step (single-stepping or program animation), stopping (breaking) (pausing the program to examine the current state) at some event or specified instruction by means of a breakpoint, and tracking the values of variables. Some debuggers have the ability to modify program state while it is running. It may also be possible to continue execution at a different location in the program to bypass a crash or logical error.

The same functionality which makes a debugger useful for correcting bugs allows it to be used as a software cracking tool to evade copy protection, digital rights management, and other software protection features. It often also makes it useful as a general verification tool, fault coverage, and performance analyzer, especially if instruction path lengths are shown. Early microcomputers with disk-based storage often benefitted from the ability to diagnose and recover corrupted directory or registry data records, to "undelete" files marked as deleted, or to crack file password protection.

Most mainstream debugging engines, such as gdb and dbx, provide console-based command line interfaces. Debugger front-ends are popular extensions to debugger engines that provide IDE integration, program animation, and visualization features.

Record and replay debugging 
Record and replay debugging, also known as "software flight recording" or "program execution recording", captures application state changes and stores them to disk as each instruction in a program executes. The recording can then be replayed over and over, and interactively debugged to diagnose and resolve defects. Record and replay debugging is very useful for remote debugging and for resolving intermittent, non-deterministic, and other hard-to-reproduce defects.

Reverse debugging

Some debuggers include a feature called "reverse debugging", also known as "historical debugging" or "backwards debugging". These debuggers make it possible to step a program's execution backwards in time. Various debuggers include this feature. Microsoft Visual Studio (2010 Ultimate edition, 2012 Ultimate, 2013 Ultimate, and 2015 Enterprise edition) offers IntelliTrace reverse debugging for C#, Visual Basic .NET, and some other languages, but not C++. Reverse debuggers also exist for C, C++, Java, Python, Perl, and other languages. Some are open source; some are proprietary commercial software. Some reverse debuggers slow down the target by orders of magnitude, but the best reverse debuggers cause a slowdown of 2× or less. Reverse debugging is very useful for certain types of problems, but is still not commonly used yet.

Time Travel debugging

In addition to the features of reverse debuggers, time travel debugging also allow users to interact with the program, changing the history if desired, and watch how the program responds.

Language dependency
Some debuggers operate on a single specific language while others can handle multiple languages transparently. For example, if the main target program is written in COBOL but calls assembly language subroutines and PL/1 subroutines, the debugger may have to dynamically switch modes to accommodate the changes in language as they occur.

Memory protection
Some debuggers also incorporate memory protection to avoid storage violations such as buffer overflow. This may be extremely important in transaction processing environments where memory is dynamically allocated from memory 'pools' on a task by task basis.

Hardware support for debugging
Most modern microprocessors have at least one of these features in their CPU design to make debugging easier:
Hardware support for single-stepping a program, such as the trap flag.
An instruction set that meets the Popek and Goldberg virtualization requirements makes it easier to write debugger software that runs on the same CPU as the software being debugged; such a CPU can execute the inner loops of the program under test at full speed, and still remain under debugger control.
In-system programming allows an external hardware debugger to reprogram a system under test (for example, adding or removing instruction breakpoints). Many systems with such ISP support also have other hardware debug support.
Hardware support for code and data breakpoints, such as address comparators and data value comparators or, with considerably more work involved, page fault hardware.
JTAG access to hardware debug interfaces such as those on ARM architecture processors or using the Nexus command set. Processors used in embedded systems typically have extensive JTAG debug support.
Micro controllers with as few as six pins need to use low pin-count substitutes for JTAG, such as BDM, Spy-Bi-Wire, or debugWIRE on the Atmel AVR. DebugWIRE, for example, uses bidirectional signaling on the RESET pin.

Debugger front-ends
Some of the most capable and popular debuggers implement only a simple command line interface (CLI)—often to maximize portability and minimize resource consumption. Developers typically consider debugging via a graphical user interface (GUI) easier and more productive. This is the reason for visual front-ends, that allow users to monitor and control subservient CLI-only debuggers via graphical user interface. Some GUI debugger front-ends are designed to be compatible with a variety of CLI-only debuggers, while others are targeted at one specific debugger.

List of debuggers

Some widely used debuggers are:
Arm DTT, formerly known as Allinea DDT
Eclipse debugger API used in a range of IDEs: Eclipse IDE (Java) Nodeclipse (JavaScript)
Firefox JavaScript debugger
GDB - the GNU debugger
LLDB
Microsoft Visual Studio Debugger
Radare2
Valgrind
WinDbg

Earlier minicomputer debuggers include:
Dynamic debugging technique (DDT)
On-line Debugging Tool (ODT)

Mainframe debuggers include:
CA/EZTEST

See also

References

Citations

Sources

External links

Debugging Tools for Windows
OpenRCE: Various Debugger Resources and Plug-ins
IntelliTrace MSDN, Visual Studio 2015

 
Debugging
Utility software types
디버거() 또는 디버깅 도구()는 다른 대상 프로그램을 테스트하고 디버그하는 데 쓰이는 컴퓨터 프로그램이다. 검사받는 코드는 명령어 집합 시뮬레이터 (ISS: Instruction set simulator) 위에서 돌아감으로 인해 특정한 조건에서 멈출 수 있는 강점을 갖지만, 직접 프로세서에서 실행될 때 보다는 느려진다. 몇몇 디버거들은 이 효과를 제한하기 위해 동작의 두 가지 모드를 제공하는데, 전체 또는 부분적 시뮬레이션이 그것이다.

소프트웨어 버그나 유효하지 않은 값에 의해서 프로그램이 정상적으로 진행되지 않는 것을 트랩이라고 한다. 소스 레벨 디버거 또는 심볼릭 디버거의 경우 프로그램이 트랩되거나 정해진 조건에 도달하면, 디버거는 원본 코드에서의 위치를 보여준다. 요즘에는 대부분의 통합 개발 환경에서 볼 수 있다. 만약 로우 레벨 디버거 또는 기계어 디버거라면 이것은 디스어셈블리에서의 위치를 보여준다.

특징 
전형적인 디버거들은 자신의 고수준에서 쿼리 프로세스, 심볼 리졸버, 표현식 해석기 그리고 디버그 지원 인터페이스를 제공한다. 또한 프로그램을 차례로 실행하는 (single stepping 또는 프로그램 애니메이션), 멈추게 하는 (breaking) (브레이크포인트를 사용해서) 그리고 변수의 값을 추적하는 것 같은 좀 더 복잡한 함수들을 제공한다. 몇몇 디버거들은 실행 중인 프로그램의 상태를 수정하는 기능도 갖는다. 또한 논리적 에러나 충돌 시 다른 위치에서 실행을 계속할 수 있다.

버그를 제거하는 데 유용한 이 기능들은 또한 복사 방지, 디지털 권리 관리 그리고 다른 소프트웨어 보호를 회피하는 소프트웨어 크래킹 툴로서 사용되기도 한다. 특히 명령어 경로 길이 (Instruction path length)가 보이는 경우, 이것은 또한 일반 검사 툴,  성능 분석기로서 사용되는 경우도 있다.

대부분의 주류 디버깅 엔진들은 (gdb나 dbx 같은) 콘솔 기반의 명령 줄 인터페이스를 제공한다. 디버거 프론트 엔드는 디버거 엔진의 대중적인 확장들이다.

역디버깅
몇몇 디버거들은 역디버깅이라고 불리는 기능을 포함한다. 이러한 디버거들은 프로그램의 실행을 되돌리는 것을 가능케 한다. 다양한 디버거들이 이 기능을 포함한다. 마이크로소프트 비주얼 스튜디오 디버거는 C#, 비주얼 베이직, .NET 등에 대해서는 이 기능을 지원하지만, C++에 대해서는 지원하지 않는다. 물론 C, C++, 자바, 파이썬 등에 대한 역디버거도 존재한다. 역디버거는 특정한 종류의 문제에 매우 유용하지만 아직은 보편적으로 사용되고 있지 않다.

메모리 보호 
디버거들은 또한 버퍼 오버플로 같은 저장소 침입을 피하기 위한 메모리 보호를 포함하기도 한다. 이것은 메모리가 메모리 "풀"에서 동적으로 할당되는 트랜잭션 처리 환경에서 매우 중요하다.

디버깅을 위한 하드웨어 지원 
대부분의 현대 마이크로프로세서들은 적어도 한 개 이상의 디버깅을 쉽게 만들어 주는 특징을 자신의 프로세서 디자인에 갖고 있다.
 트랩 플래그 같은 프로그램을 차례로 실행하기 위한 하드웨어 지원
 포펙과 골드버그의 가상화 요구를 충족시키는 명령어 집합은 디버깅 되는 소프트웨어로서 같은 프로세서에서 돌아가는 디버거 소프트웨어를 작성하는 것을 쉽게 해준다. 이러한 CPU는 테스트 시에 프로그램의 내부 루프를 실행할 수 있다. 그리고 계속 디버거의 제어 아래에 남는다.
 인 시스템 프로그래밍은 외부 하드웨어 디버거가 테스트 중에 시스템을 재프로그래밍하게 해준다. (예를 들면, 브레이크포인트 추가나 제거 같은) 이러한 ISP를 지원하는 많은 시스템들은 또한 다른 하드웨어 디버그 지원을 갖는다.
 하드웨어는 주소 비교기, 데이터 값 비교기, 페이지 부재 하드웨어 같은 코드와 데이터 브레이크포인트를 지원한다.

디버거 프론트엔드 
몇몇 유명한 디버거들은 단지 CLI로 구현된다. 개발자들은 GUI를 통해 더 쉽고 효율적인 디버깅을 고려한다. 이것은 시각적인 프론트-엔드의 이유이다. 대부분의 GUI 디버거 프론트-엔드가 특정한 디버거를 대상으로 삼는데 반해, 어떤 것들은 여러 CLI 디버거들을 대상으로 삼는다.

디버거 목록 

 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 - 모바일 후킹 및 디버거

같이 보기 
 디버그
 브레이크포인트
 커널 디버거, 메모리 디버거

외부 링크 
 
 

 
유틸리티 소프트웨어 종류