맨위로가기

디버그

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

디버그는 컴퓨터 프로그램이나 시스템에서 발생하는 오류, 즉 버그를 찾아 수정하는 과정을 의미한다. '버그'라는 용어는 1878년 토머스 에디슨이 사용한 데서 유래되었으며, 1940년대 그레이스 호퍼가 컴퓨터에서 나방이 릴레이에 끼어 오작동을 일으킨 것을 발견하고 로그에 기록하면서 널리 사용되기 시작했다. 디버깅은 버그의 존재를 인식하고, 발생원을 격리, 원인을 특정하고 수정 방법을 결정한 후 테스트하는 단계를 거친다. 디버깅 기법에는 대화형 디버깅, 인쇄 디버깅, 원격 디버깅 등이 있으며, 디버거, 정적 코드 분석 도구, 오실로스코프 등의 도구가 사용된다. 안티 디버깅 기술은 디버깅을 방해하기 위해 사용되며, 임베디드 시스템 디버깅과 자동 버그 수정 분야도 존재한다.

더 읽어볼만한 페이지

  • 디버깅 - 스택 추적
    스택 추적은 프로그램 실행 중 함수 호출 기록을 추적하여 오류 발생 시 디버깅 및 문제 해결에 필수적인 도구로, 호출 스택의 스택 프레임을 분석하여 프로그램 실행 경로를 파악하고 오류 원인을 추적하며 프로그램 안정성을 향상시키는 기술이다.
  • 디버깅 - 메모리 디버거
    메모리 디버거는 메모리 접근, 할당, 해제를 모니터링하여 메모리 오류를 찾아내고 소프트웨어의 신뢰성을 높이는 도구이다.
  • 위키백과 특수 효과용 - 찰리 채플린
    찰리 채플린은 런던 빈민가 출신으로 뛰어난 코미디 연기와 영화 연출로 세계적인 명성을 얻었으며, "작은 방랑자" 캐릭터, 슬랩스틱 코미디, 판토마임 연기, 사회 비판적 메시지, 매카시즘 시대의 탄압, 아카데미 명예상 수상 등으로 대표되는 파란만장한 삶을 살았던 영국의 배우이자 영화 감독이다.
  • 위키백과 특수 효과용 - 1996년 하계 올림픽
    1996년 하계 올림픽은 미국 애틀랜타에서 개최되어 26개 종목 271개 세부 종목으로 구성, 197개국이 참가했으나, 센테니얼 올림픽 공원 폭탄 테러 사건과 재정적 성공, 도시 인프라 개선이라는 양면성을 남겼다.
디버그
개요
정의엔지니어링 시스템에서 결함을 식별하고 수정하는 체계적인 프로세스
관련 용어버그: 시스템의 결함 또는 오류
디버거: 디버깅을 돕는 도구
소프트웨어 디버깅
중요성소프트웨어의 안정성과 품질 향상
방법테스팅: 결함 존재 확인
격리: 결함 위치 식별
수정: 결함 제거
도구디버거
코드 분석 도구
메모리 검사기
하드웨어 디버깅
대상전자 장비, 시스템
방법오실로스코프
논리 분석기
회로 내 에뮬레이터
일반적인 디버깅 기술
기술브루트 포스 디버깅: 코드 전체 검사
역추적: 오류 발생 지점부터 역으로 추적
원인 제거: 문제의 원인을 체계적으로 제거
페어 프로그래밍: 두 명이 함께 코드 검토 및 디버깅
델타 디버깅: 코드 변경 사항을 좁혀나가며 오류 위치 특정
역사적 맥락
어원"버그(bug)"와 "디버그(debug)" 용어의 유래 (벌레가 장치를 망가뜨린 사례)
초기 디버깅 방법진공관 컴퓨터 시대의 디버깅 방법

2. 용어의 기원

'버그(bug)'라는 용어는 1878년 토머스 에디슨이 자신의 발명품에서 "작은 결함과 어려움"을 표현하면서 사용되기 시작했다.[30] 1940년대 그레이스 호퍼가 Mark II 컴퓨터에서 나방이 릴레이에 끼어 오작동을 일으킨 것을 발견하고 로그북에 "버그가 발견된 최초의 실제 사례"라고 기록하면서, 컴퓨터 분야에서 '버그'는 결함을, '디버깅(debugging)'은 결함을 제거하는 과정을 의미하는 용어로 널리 사용되기 시작했다.[1] 비록 이것은 버그의 두 가지 의미(생물학적 의미와 결함)를 혼합한 농담이었을 가능성이 있지만, 당시 컴퓨터 분야에서 이 용어가 사용되었음을 보여준다.

나방이 붙어있는 Mark II 컴퓨터 로그 기록


'디버깅'이라는 용어는 컴퓨터 분야에 도입되기 전, 항공학에서 먼저 사용되었다. 제2차 세계 대전 중 원자 폭탄 개발 계획(맨해튼 계획)에서 J. 로버트 오펜하이머가 1944년 10월 27일 어니스트 로렌스에게 보낸 편지에서 이 용어를 사용한 기록이 있다.[2] 1945년 왕립 항공 학회 저널에 실린 기사에서도 항공기 엔진 테스트와 관련하여 '디버깅'이라는 용어가 사용되었다.

1951년 길(Gill)의 기사에서 프로그래밍 오류에 대한 심도 있는 논의가 있었지만, '버그' 또는 '디버깅' 용어는 사용되지 않았다.[3] 1952년 ACM 전국 회의에서 발표된 세 편의 논문에서 '디버깅' 용어가 처음 사용되었다.[4][5][6] 1963년에는 CTSS 매뉴얼에서 '디버깅'이 일반적인 용어로 사용되었다.[7]

3. 디버깅의 과정

디버깅은 일반적으로 다음과 같은 단계를 거친다.

1. 버그의 존재를 인식한다.

2. 버그의 발생원을 격리한다.

3. 버그의 원인을 특정한다.

4. 버그의 수정 방법을 결정한다.

5. 수정하고, 테스트한다.

오류가 프로그램을 이상 종료시킬 정도로 심각하거나, 프로그램이 문제를 감지하여 오류 또는 로그 메시지를 표시하면 버그의 존재를 명확히 인식할 수 있다. 그러나 오류가 경미하여 잘못된 결과를 내는 경우, 버그의 존재를 감지하기 어려울 수 있다.

디버깅의 첫 단계는 버그의 징후를 특정하는 것이다. 문제 징후, 발생 조건, 가능한 회피책 등을 관찰하는 것은 이후 디버깅에 큰 도움이 된다.

다음 단계는 시스템의 어떤 부분이 문제를 일으키는지 식별하는 것이다. 이는 디버깅에서 가장 어려운 단계 중 하나이며, 문제 발생 지점이 증상 출현 지점과 항상 일치하지는 않는다.

이 단계에서는 반복적인 소프트웨어 테스트가 필요할 수 있다. 프로그래머는 입력, 읽기, 처리 과정 등을 검증한다. 모듈화된 시스템에서는 모듈 간 인터페이스를 통해 주고받는 데이터의 타당성을 검사하여 단계를 쉽게 할 수 있다. 입력이 올바르고 출력이 그렇지 않다면, 오류 발생 원인은 해당 모듈 안에 있다. 반복적인 테스트를 통해 오류 발생 지점을 몇 줄의 코드까지 특정할 수 있다.

경험이 풍부한 프로그래머는 이전 경험을 바탕으로 문제 위치에 대한 가설을 세우고, 의심스러운 부분의 입력과 출력을 테스트한다. 이는 과학적 방법의 일종이다. 경험이 부족한 경우, 프로그램을 단계별로 실행하여 예상과 다른 지점을 찾는다. 어떤 변수에 주목할지 결정하는 것 또한 과학적 방법의 일종이다. 다른 접근 방식은 이진 탐색과 유사하게 처리 또는 데이터 흐름의 중앙 부근에서 테스트하여 오류 발생 위치를 좁혀나가는 것이다.

버그 위치를 찾았다면, 다음은 버그의 실제 원인을 밝혀내는 것이다. 여기에는 프로그램의 다른 부분 조사가 필요할 수 있다. 시스템을 잘 이해하는 것은 버그 원인 파악에 필수적이다. 숙련된 디버거는 문제 발생 위치를 파악할 수 있지만, 시스템에 정통한 사람만이 오류의 진정한 원인을 정확하게 찾을 수 있다.

버그 원인을 파악했다면, 코드 내 유사한 부분을 조사하여 실수가 반복되지 않았는지 확인하는 것이 좋다.

문제 해결의 근원을 파악했다면, 다음은 수정 방법을 결정하는 것이다. 단순한 문제가 아니라면 시스템에 대한 깊은 이해가 필수적이다. 수정으로 인해 예상치 못한 결과가 발생할 수 있으며, 기존 버그 수정으로 인해 새로운 버그가 발생하거나 숨겨진 버그가 드러날 수 있다.

상황에 따라 영구적인 수정 전에 "임시 수정(quick fix)"을 구현하는 것이 응급 처치로 바람직할 수 있다. 이는 문제의 긴급성, 발생 빈도, 부작용, 수정의 성격, 제품 일정 등을 고려하여 결정된다.

수정 후에는 시스템을 테스트하여 수정이 문제에 올바르게 대처하는지, 원치 않는 부작용을 일으키지 않는지 확인해야 한다.

규모가 큰 시스템에서는 회귀 테스트를 수행하는 것이 좋다.

4. 디버깅 기법

대화형 디버깅은 디버거 도구를 사용하여 프로그램 실행을 단계별로 처리하고, 상태를 검사하거나 변경하기 위해 일시 중지하는 기법이다. 서브루틴이나 함수 호출은 전체 속도로 실행되거나, 단계별로 실행될 수 있으며, 이러한 옵션들을 조합할 수도 있다. 오류가 의심되지 않는 코드는 전체 속도로 실행하고, 특정 지점에 중단점을 설치하여 실행을 멈출 수 있다. 반복 코드를 평가할 때는 프로그램 루프 끝에 중단점을 설정하는 것이 편리하다. 특정 변수가 변경될 때 실행을 진행하는 감시점과, 예외 또는 공유 라이브러리 로딩과 같은 특정 프로그램 이벤트에 디버거를 중지시키는 중단점도 일반적으로 사용 가능하다.
인쇄 디버깅(또는 printf 디버깅)은 추적문이나 인쇄문을 통해 프로세스의 실행 흐름과 데이터 진행 상황을 관찰하는 기법이다. 추적이라고도 한다. 추적은 특수 도구(GDB의 추적 등)를 사용하거나 소스 코드에 추적문을 삽입하여 수행할 수 있다. C에서는 printf 함수를 사용하기 때문에 printf 디버깅이라고도 한다. 초보자용 BASIC 프로그래밍 언어의 초기 버전에서는 TRON("Trace On"의 약자) 명령으로 이 기능을 켰다. TRON은 프로그램 실행 시 각 BASIC 명령 줄의 줄 번호를 출력했다.
활동 추적은 추적과 유사하지만, 한 번에 하나의 명령이나 함수 단위로 실행을 따르는 대신, 코드의 특정 부분을 실행하는 데 CPU가 소요한 시간을 기반으로 프로그램 활동을 추적한다. 이는 정의된 메모리 주소(머신 코드 프로그램) 또는 특정 프로그램 모듈(고수준 언어 또는 컴파일된 프로그램) 내에서 명령을 처리하는 데 걸리는 시간의 일부로 표시된다. 추적된 영역에서 프로그램 실행 시간의 과도한 부분이 소모되면, 잘못된 프로그램 로직으로 인한 프로세서 시간의 부적절한 할당이나, 최적화를 통해 개선될 수 있는 비효율적인 할당을 나타낼 수 있다.
원격 디버깅은 디버거와 다른 시스템에서 실행되는 프로그램을 디버깅하는 과정이다. 원격 디버깅을 시작하려면 디버거가 통신 링크(예: 로컬 영역 네트워크)를 통해 원격 시스템에 연결해야 한다. 그러면 디버거는 원격 시스템에서 프로그램의 실행을 제어하고 상태 정보를 검색할 수 있다.
사후 분석 디버깅은 프로그램이 충돌된 후의 디버깅이다. 로그 파일 검사, 충돌 시 호출 스택 출력,[8] 메모리 덤프 (또는 코어 덤프) 분석과 같은 추적 기술이 포함된다. 프로세스 덤프는 시스템에 의해 자동(예: 처리되지 않은 예외로 프로세스가 종료된 경우), 프로그래머가 삽입한 명령, 또는 대화형 사용자에 의해 수동으로 얻을 수 있다.
"울프 펜스" 알고리즘: 에드워드 가우스는 1982년 Communications of the ACM 기사에서 이 알고리즘을 다음과 같이 설명했다. "알래스카에 늑대 한 마리가 있습니다. 어떻게 찾을 수 있습니까? 먼저 주 중간에 울타리를 만들고, 늑대가 울부짖을 때까지 기다린 다음 울타리의 어느 쪽에 있는지 확인합니다. 늑대가 보일 때까지 해당 측면에서만 과정을 반복합니다."[9] Git 버전 관리 시스템에서는 ''git bisect'' 명령으로 구현되어, 특정 버그를 도입한 커밋을 결정하는 데 사용된다.
기록 및 재생 디버깅은 프로그램 실행 기록을 생성하는 기술이다(예: Mozilla의 무료 rr 디버깅 도구). 이를 재생하고 대화형으로 디버깅할 수 있다. 원격 디버깅 및 간헐적, 비결정적, 기타 재현하기 어려운 결함을 디버깅하는 데 유용하다.
시간 여행 디버깅은 프로그램 실행 중 발생하는 일을 이해하기 위해 소스 코드를 시간상 거꾸로 이동하는 과정이다(예: Undo LiveRecorder 사용). 사용자는 프로그램과 상호 작용하고, 원하는 경우 기록을 변경하고, 프로그램 반응을 볼 수 있다.
델타 디버깅은 테스트 케이스를 자동화하여 단순화하는 기술이다.[10]
사프 스퀴즈는 실패하는 테스트의 일부를 점진적으로 인라인하여 테스트 내에서 실패를 격리하는 기술이다.[11][12]
인과 관계 추적은 계산에서 원인-결과 체인을 추적하는 기술이다.[13] 널 포인터 역참조와 같은 특정 버그에 맞게 조정할 수 있다.[14]

5. 도구

디버거는 디버그를 돕는 도구이다. 디버거는 주로 원하는 코드에 중단점을 지정하여 프로그램 실행을 정지하고, 메모리에 저장된 값을 살펴보며, 실행을 재개하거나, 코드를 단계적으로 실행하는 등의 동작을 한다. 고급 디버거들은 메모리 충돌 감지, 메모리 누수 감지, 다중 스레드 관리 등의 기능도 지원한다.[25][26][27][28]

비디오 게임 콘솔의 디버깅은 일반적으로 개발자를 위한 Xbox 디버그 장치와 같은 특수 하드웨어로 수행된다.


소프트웨어 디버깅의 어려움은 시스템의 복잡성에 따라 크게 달라지며 사용된 프로그래밍 언어디버거와 같은 사용 가능한 도구에 어느 정도 따라 달라진다. 디버거는 프로그래머가 프로그램의 실행을 모니터링하고, 중지하고, 다시 시작하고, 중단점을 설정하고, 메모리의 값을 변경할 수 있도록 하는 소프트웨어 도구이다. '디버거'라는 용어는 디버깅을 수행하는 사람을 지칭할 수도 있다.

일반적으로 Java와 같은 고급 프로그래밍 언어예외 처리 및 타입 검사와 같은 기능을 갖추고 있어 변동적인 동작의 실제 원인을 더 쉽게 발견할 수 있으므로 디버깅을 더 쉽게 만든다. C 또는 어셈블리와 같은 프로그래밍 언어에서는 버그로 인해 메모리 손상과 같은 조용한 문제가 발생할 수 있으며, 초기 문제가 발생한 위치를 파악하기 어려운 경우가 많다. 이러한 경우 메모리 디버거 도구가 필요할 수 있다.

특정 상황에서는 언어별 일반 목적 소프트웨어 도구가 매우 유용할 수 있다. 이러한 도구는 정적 코드 분석 도구의 형태를 취한다.

전자 하드웨어(예: 컴퓨터 하드웨어) 및 로우 레벨 소프트웨어(예: BIOS, 장치 드라이버) 및 펌웨어를 디버깅하기 위해 오실로스코프, 로직 분석기 또는 인서킷 에뮬레이터(ICE)와 같은 기기가 단독으로 또는 조합하여 자주 사용된다. ICE는 로우 레벨 소프트웨어펌웨어에서 일반적인 소프트웨어 디버거의 많은 작업을 수행할 수 있다.

6. 안티 디버깅

안티 디버깅(Anti-Debugging)은 디버깅을 방해하고 분석을 방해하는 기술이다.[19] 디버깅을 당하면 해당 디버거 프로그램을 종료시키거나 에러를 발생시키는 등 다양한 방법을 사용하여 분석을 방해한다. 안티 디버깅 기술에는 수많은 방법이 존재하며 발전하고 있으며, 이에 따라 이를 우회하는 기술도 계속 발전하고 있다.

이는 복제 방지 방식에서 공인된 배포자가 적극적으로 사용하지만, 악성코드가 탐지 및 제거를 복잡하게 만들기 위해서도 사용된다.[20] 안티 디버깅에 사용되는 기술에는 다음과 같은 것들이 있다.


  • API 기반: 시스템 정보를 사용하여 디버거의 존재 여부를 확인
  • 예외 기반: 예외가 간섭되는지 확인
  • 프로세스 및 스레드 블록: 프로세스 및 스레드 블록이 조작되었는지 확인
  • 수정된 코드: 소프트웨어 중단점을 처리하는 디버거에 의해 이루어진 코드 수정을 확인
  • 하드웨어 및 레지스터 기반: 하드웨어 중단점 및 CPU 레지스터 확인
  • 타이밍 및 지연 시간: 명령어 실행에 걸리는 시간 확인
  • 디버거 감지 및 불이익[20]


안티 디버깅의 초기 사례는 초기 버전의 마이크로소프트 워드에서 발견되었는데, 디버거가 감지되면 "악의 나무는 쓴 열매를 맺는다. 이제 프로그램 디스크를 파기한다."라는 메시지를 표시한 후 플로피 디스크 드라이브에서 사용자가 다시 시도하지 않도록 겁을 주기 위한 경고음을 발생시켰다.[21][22]

7. 임베디드 시스템 디버깅

임베디드 시스템 환경은 개발자가 사용할 수 있는 플랫폼(CPU 아키텍처, 공급업체, 운영 체제 및 그 변형)이 매우 다양하다는 특징을 가진다. 임베디드 시스템은 범용으로 설계되지 않고, 특정 작업(또는 제한된 범위의 작업)을 위해 개발되며, 플랫폼은 해당 애플리케이션을 최적화하기 위해 특별히 선택된다. 이러한 점은 임베디드 시스템 개발자에게 어려움을 줄 뿐만 아니라, 플랫폼마다 다른 디버깅 도구가 필요하므로 시스템 디버깅 및 테스트를 더욱 어렵게 만든다.

이러한 이질성에도 불구하고, 상업적으로 개발된 디버거와 연구용 프로토타입이 존재한다. 상업용 솔루션으로는 그린힐스 소프트웨어[15], 라우터바흐 GmbH[16] 등이 있다. 연구용 프로토타입 도구로는 Aveksha[17]와 Flocklab[18]이 있다. 이들은 모두 표준 JTAG 인터페이스를 통해 신호를 주고받는 저비용 임베디드 프로세서에서 사용할 수 있는 온칩 디버그 모듈(OCDM)을 활용한다.

8. 자동 버그 수정

참조

[1] 웹사이트 InfoWorld Oct 5, 1981 https://books.google[...] 1981-10-05
[2] 웹사이트 Archived copy https://bancroft.ber[...]
[3] 간행물 The Diagnosis of Mistakes in Programmes on the EDSAC https://www.jstor.or[...] 1951-05-22
[4] 간행물 Evolution of automatic computation https://dl.acm.org/c[...] 1952
[5] 간행물 Solution of systems of linear inequalities on a digital computer https://dl.acm.org/c[...] 1952
[6] 간행물 MANIAC https://dl.acm.org/c[...]
[7] 문서 The Compatible Time-Sharing System http://www.bitsavers[...] M.I.T. Press 1963
[8] 웹사이트 Postmortem Debugging https://www.drdobbs.[...]
[9] 논문 Pracniques: The 'Wolf Fence' Algorithm for Debugging https://dl.acm.org/c[...]
[10] 서적 Why Programs Fail: A Guide to Systematic Debugging Morgan Kaufmann 2005
[11] 웹사이트 Kent Beck, Hit 'em High, Hit 'em Low: Regression Testing and the Saff Squeeze http://www.threerive[...]
[12] 웹사이트 The Saff Squeeze https://blog.thecode[...] 2022-03-28
[13] 논문 Isolating cause-effect chains from computer programs 2002-11-01
[14] 서적 Proceedings of the 22nd annual ACM SIGPLAN conference on Object oriented programming systems and applications - OOPSLA '07
[15] 웹사이트 SuperTrace Probe hardware debugger https://www.ghs.com/[...]
[16] 웹사이트 Debugger and real-time trace tools https://www.lauterba[...]
[17] 서적 Proceedings of the 9th ACM Conference on Embedded Networked Sensor Systems ACM 2011
[18] 서적 Proceedings of the 12th international conference on Information processing in sensor networks ACM 2013
[19] 웹사이트 Anti-Debugging Series – Part I https://www.veracode[...] 2008-12-02
[20] 웹사이트 Software Protection through Anti-Debugging Michael N Gagnon, Stephen Taylor, Anup Ghosh http://people.seas.h[...]
[21] 서적 Security Engineering https://archive.org/[...] Wiley 2001-03-23
[22] 웹사이트 Microsoft Word for DOS 1.15 http://toastytech.co[...]
[23] 웹사이트 de-の意味・使い方|英辞郎 on the WEB https://eow.alc.co.j[...]
[24] 웹사이트 bug http://www.catb.org/[...] 2003-12-29
[25] 웹사이트 Compiler Warning (level 1 and level 4) C4700 | Microsoft Learn https://learn.micros[...]
[26] 웹사이트 Diagnostic flags in Clang — Clang git documentation https://clang.llvm.o[...]
[27] 웹사이트 Annotating function parameters and return values | Microsoft Learn https://learn.micros[...]
[28] 웹사이트 Attributes in Clang — Clang git documentation https://clang.llvm.o[...]
[29] 서적 순서도 작성 정익사
[30] 웹사이트 InfoWorld Oct 5, 1981 https://books.google[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com