디버거
Debugger시리즈의 일부(on) |
소프트웨어 개발 |
---|
디버거(debugger) 또는 디버깅 툴(debugging tool)은 다른 프로그램을 테스트하고 디버깅하는 데 사용되는 컴퓨터 프로그램입니다.디버거의 주된 용도는 프로그래머가 그것의 실행을 추적하고 오작동 코드를 나타낼 수 있는 컴퓨터 자원의 변화를 감시할 수 있도록 제어된 조건에서 대상 프로그램을 실행하는 것입니다.일반적인 디버깅 기능은 특정 지점에서 대상 프로그램을 실행 또는 중지하고, 메모리, CPU 레지스터 또는 저장 장치(예: 디스크 드라이브)의 내용을 표시하며, 프로그램 실행 오류의 원인이 될 수 있는 선택된 테스트 데이터를 입력하기 위해 메모리 또는 레지스터의 내용을 수정하는 기능을 포함합니다.
검사할 코드는 ISS(Instruction Set Simulator)에서 실행될 수도 있습니다. ISS는 특정 조건이 발생했을 때 이 기능을 정지시키는 강력한 파워를 허용하지만 일반적으로 해당 프로세서에서 직접 코드를 실행하는 것보다 다소 느립니다.일부 디버거는 이러한 영향을 제한하기 위해 전체 또는 부분 시뮬레이션의 두 가지 작동 모드를 제공합니다.
"트랩"은 프로그래밍 버그나 잘못된 데이터 때문에 프로그램을 정상적으로 계속할 수 없을 때 발생합니다.예를 들어, 프로그램이 현재 버전의 CPU에서 사용할 수 없는 명령을 사용하려고 시도했거나 사용할 수 없거나 보호된 메모리에 액세스하려고 시도했을 수 있습니다.프로그램이 "트랩"되거나 미리 설정된 조건에 도달하면 디버거는 소스 레벨 디버거 또는 심볼릭 디버거인 경우 일반적으로 원래 코드의 위치를 표시합니다.하위 디버거 또는 기계 언어 디버거인 경우 분해 시 줄이 표시됩니다(원래 소스 코드에 온라인으로 액세스할 수 있고 어셈블리 또는 컴파일에서 해당하는 부분의 코드를 표시할 수 있는 경우가 아니라면).
특징들
일반적으로 디버거는 쿼리 프로세서, 심볼 리졸버, 표현 해석기 및 디버그 지원 인터페이스를 최상위 레벨에 제공합니다.[1]디버거는 또한 중단점을 통해 프로그램을 단계적으로 실행하거나(단일 스텝 또는 프로그램 애니메이션), 일부 이벤트 또는 지정된 명령에서 프로그램을 중지(중단하여 현재 상태를 검사), 변수 값을 추적하는 등 보다 정교한 기능을 제공합니다.[2]일부 디버거는 프로그램이 실행되는 동안 프로그램 상태를 수정할 수 있습니다.충돌이나 논리적 오류를 우회하기 위해 프로그램의 다른 위치에서 실행을 계속할 수도 있습니다.
디버거를 버그 수정에 유용하게 사용하는 것과 동일한 기능을 통해 복사 방지, 디지털 권한 관리 및 기타 소프트웨어 보호 기능을 회피하는 소프트웨어 크래킹 도구로 사용할 수 있습니다.또한 명령어 경로 길이가 표시된 경우 일반적인 검증 도구, 장애 범위 및 성능 분석기로도 유용합니다.[3]디스크 기반 스토리지를 갖춘 초기 마이크로컴퓨터는 손상된 디렉토리 또는 레지스트리 데이터 레코드를 진단 및 복구하거나, 삭제된 것으로 표시된 파일을 "삭제 해제"하거나, 파일 암호 보호를 해제할 수 있는 이점을 누렸습니다.
gdb 및 dbx와 같은 대부분의 메인스트림 디버깅 엔진은 콘솔 기반 명령줄 인터페이스를 제공합니다.디버거 프론트엔드는 IDE 통합, 프로그램 애니메이션 및 시각화 기능을 제공하는 디버거 엔진의 일반적인 확장 기능입니다.
기록 및 재생 디버깅
"소프트웨어 비행 기록"[4] 또는 "프로그램 실행 기록"으로도 알려진 기록 및 재생 디버깅은 프로그램의 각 명령이 실행될 때 응용 프로그램 상태 변경을 캡처하여 디스크에 저장합니다.그런 다음 기록을 반복해서 재생하고 결함을 진단하고 해결하기 위해 상호작용적으로 디버깅할 수 있습니다.기록 및 재생 디버깅은 원격 디버깅과 간헐적, 비결정적 및 기타 재현하기 어려운 결함을 해결하는 데 매우 유용합니다.
리버스 디버깅
일부 디버거는 "역 디버깅"이라는 기능을 포함하며, "역 디버깅" 또는 "역 디버깅"이라고도 합니다.이 디버거들은 프로그램의 실행을 시간에 역행하는 것을 가능하게 합니다.다양한 디버거들이 이 기능을 포함합니다.Microsoft Visual Studio(2010 Ultimate Edition, 2012 Ultimate, 2013 Ultimate 및 2015 Enterprise Edition)는 C#, Visual Basic에 대한 IntelliTrace 역 디버깅을 제공합니다.NET, 그리고 다른 언어들도 있지만, C++는 아닙니다.C, C++, Java, Python, Perl 및 기타 언어에 대해서도 역 디버거가 존재합니다.일부는 오픈 소스이고 일부는 독점 상용 소프트웨어입니다.일부 리버스 디버거는 크기가 몇 배 이상으로 목표 속도를 늦추지만, 최고의 리버스 디버거는 2배 이하의 속도를 냅니다.역방향 디버깅은 특정 유형의 문제에 매우 유용하지만 아직 일반적으로 사용되지는 않습니다.[5]
시간 이동 디버깅
역 디버거의 기능 외에도 시간 여행 디버깅을 통해 사용자는 프로그램과 상호 작용하여 원하는 경우 기록을 변경하고 프로그램이 어떻게 반응하는지 볼 수 있습니다.
언어의존성
어떤 디버거는 특정 언어 하나로 작동하는 반면 다른 디버거는 여러 언어를 투명하게 처리할 수 있습니다.예를 들어, 주요 대상 프로그램이 COBOL로 작성되었지만 어셈블리 언어 서브루틴과 PL/1 서브루틴을 호출하는 경우, 디버거는 발생하는 언어의 변화를 수용하기 위해 동적으로 모드를 전환해야 할 수 있습니다.
메모리 보호
일부 디버거는 버퍼 오버플로와 같은 스토리지 위반을 방지하기 위해 메모리 보호 기능을 통합하기도 합니다.이는 메모리 '풀'에서 작업별로 메모리를 동적으로 할당하는 트랜잭션 처리 환경에서 매우 중요할 수 있습니다.
디버깅을 위한 하드웨어 지원
대부분의 최신 마이크로프로세서는 디버깅을 보다 쉽게 하기 위해 CPU 설계에 다음과 같은 기능 중 하나 이상을 포함하고 있습니다.
- 트랩 플래그와 같은 단일 스텝 프로그램을 지원하는 하드웨어입니다.
- Popek 및 Goldberg 가상화 요구 사항을 충족하는 명령어 집합을 사용하면 디버그되는 소프트웨어와 동일한 CPU에서 실행되는 디버거 소프트웨어를 더 쉽게 작성할 수 있습니다. 이러한 CPU는 테스트 대상 프로그램의 내부 루프를 최대 속도로 실행할 수 있지만 여전히 디버거 제어 하에 있습니다.
- 시스템 내 프로그래밍을 통해 외부 하드웨어 디버거가 테스트 대상 시스템을 다시 프로그래밍할 수 있습니다(예: 명령 중단점 추가 또는 제거).이러한 ISP 지원이 있는 많은 시스템에는 다른 하드웨어 디버그 지원도 있습니다.
- 주소 비교기 및 데이터 값 비교기와 같은 코드 및 데이터 중단점에 대한 하드웨어 지원 또는 작업량이 상당히 많은 페이지 장애 하드웨어.[6]
- ARM 아키텍처 프로세서에 있거나 Nexus 명령 집합을 사용하는 것과 같은 하드웨어 디버그 인터페이스에 대한 JTAG 액세스.임베디드 시스템에 사용되는 프로세서는 일반적으로 광범위한 JTAG 디버그 지원을 받습니다.
- 6개 이하의 핀을 가진 마이크로컨트롤러는 BDM, Spy-Bi-Wire 또는 디버그와 같은 JTAG의 낮은 핀 수 대용품을 사용해야 합니다.아트멜 AVR에 와이어를 연결합니다.예를 들어, DebugWIRE는 RESET 핀에서 양방향 시그널링을 사용합니다.
디버거 프론트엔드
가장 유능하고 인기 있는 디버거 중 일부는 간단한 CLI(명령줄 인터페이스)만 구현합니다. 종종 휴대성을 극대화하고 리소스 소모를 최소화하기도 합니다.개발자들은 일반적으로 그래픽 사용자 인터페이스(GUI)를 통한 디버깅이 더 쉽고 생산적이라고 생각합니다.[citation needed]이는 그래픽 사용자 인터페이스를 통해 하위 CLI 전용 디버거를 모니터링하고 제어할 수 있는 시각적 프론트엔드의 이유입니다.일부 GUI 디버거 프론트엔드는 다양한 CLI 전용 디버거와 호환되도록 설계된 반면 다른 것들은 특정 디버거를 대상으로 합니다.
디버거 목록
널리 사용되는 디버거는 다음과 같습니다.
- Active-Pro 내장 펌웨어 및 하드웨어 디버거
- Arm DTT, 이전에는 Allinea DDT로 알려짐
- 다양한 IDE에 사용되는 이클립스 디버거 API: Eclipse IDE (Java) Nodeclipse (JavaScript)
- 파이어폭스 자바스크립트 디버거
- GDB - GNU 디버거
- LLDB
- 마이크로소프트 비주얼 스튜디오 디버거
- 라데레
- 발그린드
- WinDbg
이전 미니 컴퓨터 디버거는 다음과 같습니다.
- 동적 디버깅 기법 (DDT)
- ODT(Online Debugging Tool)
메인프레임 디버거는 다음과 같습니다.
참고 항목
참고문헌
인용문
- ^ 아그가르왈과 쿠마르, 302쪽.
- ^ Aggarwal과 Kumar 2003, p. 301.
- ^ 아그가르왈과 쿠마르, 페이지 307-312.
- ^ O'Callahan, Robert; Jones, Chris; Froyd, Nathan; Huey, Kyle; Noll, Albert; Partush, Nimrod (2017). "Engineering Record And Replay For Deployability Extended Technical Report". arXiv:1705.05937 [cs.PL].
- ^ Philip Claßen; Undo Software. "Why is reverse debugging rarely used?". Programmers Stack Exchange. Stack Exchange, Inc. Retrieved 12 April 2015.
- ^ Aggarwal과 Kumar 2003, pp. 299-301.
원천
- Sanjeev Kumar Aggarwal; M. Sarath Kumar (2003). "Debuggers for Programming Languages". In Y.N. Srikant; Priti Shankar (eds.). The Compiler Design Handbook: Optimizations and Machine Code Generation. Boca Raton, Florida: CRC Press. pp. 295–327. ISBN 978-0-8493-1240-3.
- Jonathan B. Rosenberg (1996). How Debuggers Work: Algorithms, Data Structures, and Architecture. John Wiley & Sons. ISBN 0-471-14966-7.
외부 링크
- Windows용 디버깅 툴
- OpenRCE: 다양한 디버거 리소스 및 플러그인
- IntelliTrace MSDN, Visual Studio 2015