들어가며

버그(Bug): 예기치 않은 오류나 잘못된 결과를 낳게 하는 코드

디버깅(Debugging): 발생한 버그를 제거하기 위한 행위

디버거(Debugger): 프로그램을 실행 도중의 프로그램의 내부 상황을 사용자가 모니터링할 수 있게 도와준다.

시중에는 디버깅 환경, 분석 대상과 필요성에 따라 다양한 디버거가 존재한다. 그 중, 윈도우 운영체제에서는 WinDbg가 대표적인 위치를 차지하고 있다.


WinDbg 사용해보기

Launch Executable

디버깅을 하는 가장 첫 단계는 디버깅할 프로그램을 디버거 위에서 실행하거나 이미 실행 중인 프로세스의 제어권을 디버거가 가지게끔 하는 것이다. WinDbg는 디버깅할 프로그램을 디버거 위에서 실행해주는 Launch Executable 기능을 지원하고 있다.

상단 메뉴 바의 "File"을 클릭한 후 위 화면의 "Start debugging"에서 빨간색 박스로 표시한 "Launch executable"을 클릭하면 컴퓨터에 저장된 실행 파일을 선택하여 디버깅을 시작할 수 있다.

Launch executable을 이용해 강의 실습 바이너리를 열어보자.

그 결과로 프로그램이 실행되는 과정에서 중단점에 도달하여 디버거에서 프로세스에 대한 제어권이 넘어온 상태가 된다.

중단점이란(Breakpoint)?

중단점이란 **프로그램이 실행되다가 특정 지점에서 잠깐 멈추게 만드는 표시(장치)**를 말한다.

디버거가 그 코드 위치에 int 3이라는 명령을 끼워 넣는(삽입하는) 방식이 흔하다.(*int 3: 디버거용으로 멈추는 명령)

이후 실행을 재개하면 디버거는 삽입한 int 3 명령어를 본래의 코드로 되돌려 놓으며, 실행을 재개한 후 프로세스가 정상적으로 동작할 수 있게 한다.

Launch executable 도중 중단점을 설정한 적이 없는데 중단점이 걸리는 이유

Launch executable 모드로 실행하면 디버거가 프로그램 시작 단계부터 붙은 상태로 실행된다.