디버거
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
디버거는 프로그램의 오류를 찾아 수정하고, 실행 과정을 단계별로 추적하며 변수 값을 확인하는 데 사용되는 도구이다. 주요 기능으로는 중단점 설정, 단계별 실행, 변수 확인 및 변경 등이 있으며, 소프트웨어 크래킹이나 성능 분석에도 활용될 수 있다. 디버거는 명령줄 인터페이스, GUI 프론트엔드, 하드웨어 지원 등 다양한 형태로 제공되며, GDB, LLDB, Visual Studio Debugger 등 다양한 종류가 존재한다. 또한 역디버깅, 메모리 보호 기능도 제공하며, 웹 브라우저 내장 디버거, 윈도우 디버거 등 특정 환경에 특화된 디버거도 있다. 디버깅은 불법적인 소프트웨어 크래킹에 악용될 수 있으므로, 관련 법규를 준수하여 사용해야 한다.
더 읽어볼만한 페이지
- 유틸리티 소프트웨어 종류 - 데이터 압축
데이터 압축은 디지털 데이터의 크기를 줄여 저장 공간을 절약하고 전송 속도를 향상시키는 기술로, 모르스 부호에서 시작하여 ZIP, JPEG, LZ77 등 다양한 방식으로 발전해 왔으며, 무손실 압축과 손실 압축으로 나뉘고 최근에는 인공지능 기술을 활용하여 효율성을 높여 다양한 분야에서 활용되고 있다. - 유틸리티 소프트웨어 종류 - 바이러스 검사 소프트웨어
바이러스 검사 소프트웨어는 악성 소프트웨어의 감염을 탐지, 제거 또는 차단하는 소프트웨어로, 다양한 기술을 사용하여 악성코드를 식별하고 시스템을 감시하며, V3, 노턴 안티바이러스, 알약 등 다양한 종류가 존재한다. - 디버거 - Valgrind
Valgrind는 동적 분석 도구들의 프레임워크로, 가상 머신 기반으로 작동하며 메모리 오류 감지, 멀티스레드 코드 분석 등 다양한 기능을 제공하지만, 정적 또는 스택 할당 데이터의 경계 오류는 모두 감지하지 못한다. - 디버거 - Eclipse (소프트웨어)
이클립스는 IBM에서 개발한 자바 기반의 통합 개발 환경으로, OSGi 서비스 플랫폼을 런타임 아키텍처로 사용하며, 플러그인을 통해 기능을 확장할 수 있고, 이클립스 퍼블릭 라이선스를 따르며, 한국어를 지원한다.
디버거 | |
---|---|
일반 정보 | |
![]() | |
유형 | 디버거 |
개발사 | GNU 프로젝트 |
최초 출시 | 1986년 |
최신 버전 | 14.1 (2024년 5월 9일) |
운영체제 | 유닉스 계열 운영 체제, 마이크로소프트 윈도우 |
라이선스 | GNU 일반 공중 사용 허가서 버전 3+ |
웹사이트 | GNU 디버거 공식 웹사이트 |
상세 정보 | |
특징 | 역어셈블 메모리 및 레지스터 수정 임의 코드 삽입 |
예제 | |
명령 | break (줄 번호 또는 함수 이름): 중단점 설정 run: 프로그램 실행 next: 다음 줄 실행 (함수 호출 건너뜀) step: 다음 줄 실행 (함수 호출 내부로 진입) continue: 실행 재개 print (변수 이름): 변수 값 출력 backtrace: 호출 스택 출력 quit: 디버거 종료 |
2. 특징
디버거는 프로그램 실행을 제어하고, 변수 값을 추적하며, 메모리 상태를 검사하는 등 다양한 기능을 제공하여 개발자가 버그를 효율적으로 찾고 수정할 수 있도록 돕는다.
일반적으로 디버거는 쿼리 프로세서, 기호 해석기, 표현식 인터프리터 및 디버그 지원 인터페이스를 제공한다.[1] 디버거는 프로그램을 단계별 실행 ('''싱글 스텝''' 또는 프로그램 애니메이션)으로 실행하고, 중단점을 통해 특정 이벤트 또는 지정된 명령에서 중지('''브레이킹''')하여 현재 상태를 검사하고, 변수 값을 추적하는 기능을 제공한다.[2] 일부 디버거는 프로그램 실행 중 상태를 수정하거나, 충돌이나 논리 오류를 우회하여 다른 위치에서 실행을 계속할 수 있게 한다.
이러한 디버거의 기능은 소프트웨어 크래킹 도구로 사용되어 복사 방지, 디지털 권한 관리 및 기타 소프트웨어 보호 기능을 회피하는 데 사용될 수 있다. 또한 일반적인 검증 도구, 결함 커버리지 및 성능 분석기로도 유용하다.
gdb 및 dbx와 같은 대부분의 주류 디버깅 엔진은 콘솔 기반의 명령줄 인터페이스를 제공한다. 디버거 프론트엔드는 IDE 통합, 프로그램 애니메이션 및 시각화 기능을 제공하는 디버거 엔진의 확장 기능이다.
소프트웨어 개발 초기에는 오류(버그)가 포함되어 설계대로 동작하지 않거나, 출력 결과가 정확하지 않은 경우가 많다. 따라서 소프트웨어 테스트를 실행하면서, 올바르게 동작하도록 프로그램을 수정하고 버그를 제거하는 디버깅 작업이 필요하다.
고전적인 방법으로는 소스 코드를 한 줄씩 육안으로 검사(코드 리뷰)하면서 사고 실험을 통해 논리적인 오류를 찾는 방법이 있다. 또한 표준 출력 등을 이용하여 실제 변수의 상태나 프로그램 실행 순서 등을 시계열로 표시하면서 프로그램 동작 및 문제 재현 절차, 발생 시점을 확인하는 방법( C 언어의 printf 함수를 사용한 "printf 디버깅"[7])도 사용된다.
그러나 소프트웨어 규모가 커짐에 따라 버그의 수도 증가하고, 복잡한 프로그램에서는 문제 원인을 특정하기 어려워진다. 표준 출력을 사용할 수 없는 환경이나 로그가 빠르게 지나가는 경우 printf 디버깅은 적용하기 어렵다. 또한 디버깅용 출력 처리를 추가하면 소스 코드 유지 보수성이 저하되고, 시스템 부작용으로 인해 타이밍이 어긋나 문제점이 발생하지 않게 되는 경우도 있다.
이러한 문제를 해결하기 위해 프로그래밍 도구 중 하나인 디버거를 이용하여 테스트 실행 및 디버깅의 효율성을 높인다. 디버거를 사용하면 사고 실험이나 printf 디버깅으로는 어려웠던, 고도의 실행 시 검증을 할 수 있다.
디버거는 디버깅 대상 프로세스에 연결하여 프로세스 실행 상황에 관한 정보를 양방향으로 통신한다. 운영체제에는 디버거 구현에 이용 가능한 API가 제공되는 경우도 있다.[8] 컴파일을 통해 기계어나 중간 표현으로 변환되는 프로그래밍 언어의 경우, 디버깅을 위해 컴파일 및 빌드 시 소스 코드 관련 메타데이터인 "프로그램 데이터베이스"(pdb)라는 추가 정보를 생성한다. 디버깅 실행 시 이 심볼 정보를 참조하여 디버거는 현재 실행 중인 프로그램 위치 등을 특정할 수 있다.
디버거는 성능 분석 및 성능 강화에도 사용되지만, 이는 프로파일러의 역할이다. 디버깅용으로 컴파일 및 빌드된 프로그램은 여분의 코드나 최적화되지 않은 코드를 포함하고 있어 프로그램 본래의 성능 지표로 사용하기는 어렵다. 또한 프로그램에 디버거를 연결하면 오버헤드가 발생할 수 있다.
2. 1. 주요 기능
디버거는 일반적으로 다음과 같은 핵심 기능들을 제공한다.[1][2]- '''브레이크포인트''': 소스 코드의 특정 위치에 설정하여 프로그램 실행을 일시 중지시키는 기능이다. 브레이크포인트를 설정하면 디버거는 해당 지점에서 프로그램 실행을 멈추고, 개발자는 변수 값이나 메모리 상태 등 프로그램의 현재 상태를 검사할 수 있다. 검사 후에는 실행을 재개하거나 다음 단계로 넘어갈 수 있다.
- '''단계별 실행''': 프로그램의 실행을 한 단계씩 진행하면서 각 단계의 결과를 확인하는 기능이다. 이를 통해 코드의 흐름을 자세히 추적하고, 문제 발생 지점을 정확하게 파악할 수 있다. 단계별 실행에는 다음과 같은 세부 기능들이 있다.
- '''단계 진입''': 함수 또는 메서드 내부로 들어가서 실행을 계속한다.
- '''단계 건너뛰기''': 현재 실행 중인 함수 또는 메서드의 다음 단계로 이동한다.
- '''단계 벗어나기''': 현재 실행 중인 함수 또는 메서드의 실행을 완료하고, 호출한 쪽으로 돌아간다.
- '''변수 확인/변수 변경''': 프로그램 실행 중 특정 변수의 값을 확인하거나 변경하는 기능이다. 이를 통해 변수에 예상치 못한 값이 할당되거나, 잘못된 연산이 수행되는지 등을 확인할 수 있다. 일부 디버거는 변수 이름뿐만 아니라 수식(expression)을 사용하여 값을 확인하거나, 실행 중인 프로그램의 변수 값을 임의로 변경할 수도 있다.
2. 2. 역디버깅 (Reverse debugging)
몇몇 디버거는 '''역디버깅'''(Reverse debugging) 기능을 제공한다. 이 기능은 프로그램 실행을 시간을 거슬러 되돌릴 수 있게 한다. '''역방향 디버깅''', "과거 디버깅", "거꾸로 디버깅"이라고도 불린다. 마이크로소프트 비주얼 스튜디오는 C#, 비주얼 베이직 .NET 등에서는 이 기능을 지원하지만, C++에서는 지원하지 않는다. C, C++, 자바, 파이썬, 펄 등 다양한 언어용 역디버거도 존재한다. 일부는 오픈 소스이고, 일부는 독점 상용 소프트웨어이다. 어떤 역방향 디버거는 대상 프로그램의 속도를 수십 배 느리게 만들지만, 최적화된 역방향 디버거는 2배 이하의 속도 저하만 발생시킨다. 역디버깅은 특정 유형의 문제를 해결하는 데 매우 유용하지만, 아직 널리 사용되지는 않는다.2. 3. 메모리 보호 (Memory protection)
일부 디버거는 버퍼 오버플로와 같은 저장소 침입을 피하기 위한 메모리 보호 기능을 포함하기도 한다. 이는 메모리가 메모리 "풀"에서 동적으로 할당되는 트랜잭션 처리 환경에서 매우 중요하다.[1]3. 하드웨어 지원
- 트랩 플래그와 같이 프로그램을 순차적으로 실행하기 위한 하드웨어 지원이 있다.[6]
- 포펙과 골드버그의 가상화 요구를 충족하는 명령어 집합은 디버깅되는 소프트웨어와 같은 프로세서에서 실행되는 디버거 소프트웨어를 작성하기 쉽게 해준다. 이러한 CPU는 테스트 시 프로그램의 내부 루프를 실행하면서도 디버거의 제어 하에 둘 수 있다.[6]
- 인 시스템 프로그래밍은 외부 하드웨어 디버거가 테스트 중인 시스템을 다시 프로그래밍할 수 있게 해준다. (예: 브레이크포인트 추가 또는 제거) 이러한 ISP를 지원하는 많은 시스템은 다른 하드웨어 디버그 지원도 갖추고 있다.[6]
- 하드웨어는 주소 비교기, 데이터 값 비교기, 페이지 부재 하드웨어와 같은 코드 및 데이터 브레이크포인트를 지원한다.[6]
- ARM 아키텍처 프로세서와 같은 하드웨어 디버그 인터페이스 또는 넥서스 명령 집합을 사용하는 JTAG 액세스를 지원한다. 임베디드 시스템에 사용되는 프로세서는 일반적으로 광범위한 JTAG 디버그 지원을 갖추고 있다.[6]
- 6개 핀 정도의 마이크로 컨트롤러는 BDM, 스파이-바이-와이어, 또는 Atmel AVR의 디버그와이어와 같이 JTAG를 대체하는 적은 핀 수를 사용하는 방법을 사용해야 한다. 예를 들어 DebugWIRE는 RESET 핀에서 양방향 신호를 사용한다.[6]
4. 디버거 프론트엔드
gdb나 dbx와 같은 대부분의 주류 디버깅 엔진은 콘솔 기반의 명령 줄 인터페이스를 제공한다. 디버거 프론트엔드는 디버거 엔진의 인기 있는 확장이며, IDE 통합, 프로그램 애니메이션 및 시각화 기능을 제공한다.[1]
개발자들은 그래픽 사용자 인터페이스(GUI)를 통한 디버깅이 더 쉽고 생산적이라고 생각한다. 이러한 이유로 시각적 프론트엔드가 존재하며, 사용자는 그래픽 사용자 인터페이스를 통해 하위 CLI 전용 디버거를 모니터링하고 제어할 수 있다. 일부 GUI 디버거 프론트엔드는 다양한 CLI 전용 디버거와 호환되도록 설계되었으며, 다른 일부는 특정 디버거를 대상으로 한다.
5. 디버거 목록
다양한 프로그래밍 언어와 운영체제에 맞춰 다양한 디버거들이 개발되어 사용되고 있다.
이름 | 설명 |
---|---|
Arm DTT | 이전 명칭은 Allinea DDT이다. |
Radare2 | |
Cheat Engine |
이름 |
---|
동적 디버깅 기술 (DDT) |
온라인 디버깅 도구 (ODT) |
이름 |
---|
CA/EZTEST |
대부분의 운영 체제와 프로그래밍 언어 처리계에는 명령 줄에서 다룰 수 있는 디버거가 부속되어 있으며, 대부분의 통합 개발 환경에는 GUI를 통해 정보의 직관적이고 고도화된 시각화가 가능한 비주얼 디버거가 부속되어 있다.
다음은 기타 디버거 목록이다.
- AppPuncher 디버거 — 리치 인터넷 애플리케이션 디버깅
- AQtime
- CA/EZTEST — CICS 인터랙티브 테스트/디버그 소프트웨어 패키지
- [http://charm.cs.uiuc.edu/research/parallel_debug/ CharmDebug] — Charm++용 디버거
- 코드뷰
- DBG — PHP 디버거 및 프로파일러
- dbx
- DDD (데이터 디스플레이 디버거)
- 분산 디버깅 툴 (Allinea DDT)
- DDTLite — Allinea DDTLite (비주얼 스튜디오 2008용)
- DEBUG — DOS 및 마이크로소프트 윈도우에 기본 내장된 디버거
- [http://www.mydebugger.com 디버거 (MySQL용)]
- 오페라 드래곤플라이
- 다이내믹 디버깅 테크닉 (DDT), 옥털 디버깅 테크닉(Octal Debugging Technique)
- 임베디드 시스템 디버그 플러그인 포 이클립스(Embedded System Debug Plug-in for Eclipse)
- 퓨전디버그
- [https://web.archive.org/web/20110711125753/http://www.gremedy.com/gDEBuggerCL.php gDEBugger] OpenGL, OpenGL ES, OpenCL 디버거 및 프로파일러
- [http://code.google.com/p/hyperdbg/ HyperDBG] - 하드웨어 보조 가상화를 이용한 커널 디버거
- 인텔 디버거 (IDB)
- 인사이트
- 파라소프트 Insure++
- iSYSTEM — 인 서킷 디버거 (임베디드 시스템용)
- 인터랙티브 디스어셈블러 (IDA 프로)
- 자바 플랫폼 디버거 아키텍처
- 징크스(Jinx) — heisenbugs용 시스템 디버거. 장치 드라이버로 투명하게 동작.
- JSwat — 오픈 소스 자바 디버거
- 맥스버그(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)
- Lauterbach TRACE32 — 임베디드 시스템용 인 서킷 디버거
- 터보 디버거
- Ups — C, 포트란 소스 수준 디버거
- VB 워치 디버거 — 비주얼 베이직 6.0용 디버거
- Xdebug — PHP 디버거 및 프로파일러
- frida - 모바일 후킹 및 디버거
5. 1. 크로스 플랫폼 디버거
- GDB - GNU 프로젝트의 디버거이다.
- LLDB - LLVM 프로젝트의 디버거이다.
- 이클립스 디버거 - 이클립스 IDE에 내장된 디버거로 Java, JavaScript 등 다양한 언어를 지원한다.
5. 2. 웹 브라우저 내장 디버거
구글 크롬의 Chrome DevTools는 웹 브라우저의 일부 기능으로 제공된다.[1] 모질라 파이어폭스의 자바스크립트 디버거도 웹 브라우저 내장 디버거이다.[1]5. 3. Windows 디버거
- 마이크로소프트 비주얼 스튜디오 디버거: C/C++ 네이티브 코드 및 C#/VB.NET 등의 관리 코드 디버깅을 지원하며, 애드인을 통해 추가 언어를 지원할 수도 있다.[1] "편집 및 계속"(Edit and Continue) 기능을 통해 브레이크 중에 소스 코드의 일부를 수정하여 빌드 및 재개할 수 있다.[1]
- WinDbg
- x64dbg/x32dbg
- Visual Basic for Applications의 디버거: Visual Basic 에디터와 함께 마이크로소프트 오피스 내장 통합 개발 환경에 부속되어 있다.[2]
5. 4. 기타 디버거
6. 윤리적 및 법적 디버깅
디버깅은 소프트웨어 개발 과정에서 필수적이지만, 복사 방지, 디지털 권리 관리 등 소프트웨어 보호를 회피하는 소프트웨어 크래킹 도구로 악용될 수 있다. 이러한 기능들은 버그를 제거하는 데 유용하지만, 불법적인 목적으로 사용될 수도 있다.[1]
크랙미는 크래킹 또는 디버깅을 위해 특별히 설계된 프로그램으로, 디버거를 사용하는 사람들이 법적인 문제에 휘말리지 않고 디버깅 능력을 연습할 수 있게 해준다.[1]
참조
[1]
서적
[2]
서적
[3]
서적
[4]
간행물
Engineering Record And Replay For Deployability Extended Technical Report
[5]
웹사이트
Why is reverse debugging rarely used?
http://programmers.s[...]
Stack Exchange, Inc
2015-04-12
[6]
서적
[7]
웹사이트
もう一度基礎からC言語 第13回 エラーメッセージと対処方法(3)~開発手順の効率化 printfデバッグを試す
https://dev.grapecit[...]
2020-07-17
[8]
웹사이트
プロセスデバッガを作ってみる
http://codezine.jp/a[...]
2020-07-17
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com