브레이크 포인트의 정의와 종류 (2) 하드웨어 브레이크포인트
| 하드웨어 브레이크포인트
하드웨어 브레이크포인트(Hardware Breakpoint)는 설정할 브레이크포인트의 개수가 적을 떄나 디버깅할 소프트웨어의 코드가 변경되면 안될 때 유용하게 사용할 수 있다. 이런 형태의 브레이크포인트는 CPU 레벨에서 브레이크포인트를 설정하는 것이다. 즉, 디버그 레지스터라고 불리는 특별한 레지스터를 이용한다. CPU에는 일반적으로 하드웨어 브레이크포인트를 설정하는 데 사용되는 디버그 레지스터가 8개(DR0~DR7) 있다. DR0에서 DR3까지의 디버그 레지스터는 브레이크포인트의 주소를 저장하기 위해 사용된다. 이는 단지 한 번에 최대 4개까지의 하드웨어 브레이크포인트만을 설정할 수 있다는 뜻이다.
디버거 레지스터 DR4와 DR5는 예약된 레지스터이고, DR6는 브레이크포인트에 의해 발생되는 디버깅 이벤트의 종류를 판단하기 위해 사용되는 상태 레지스터다. 디버그 레지스터 DR7은 하드웨어 브레이크포인트의 ON/OFF 스위치로 사용되며, 서로 다른 브레이크포인트의 조건도 저장한다. DR7의 특정 플래그값을 설정하면 다음과 같은 조건의 브레이크포인트를 만들어낼 수 있다.
- 지정된 주소의 명령이 실행될 때
- 데이터가 어느 주소에 써질 때
- 어느 주소에 대한 읽기/쓰기 작업이 수행될 때
이처럼 하드웨어 브레이크포인트는 실행 중인 프로세스의 코드를 변경하지 않고 매우 구체적인 조건의 브레이크포인트를 최대 4개까지 설정할 수 있다.
소프트 브레이크포인트에서는 INT 3 이벤트를 사용하지만 하드웨어 브레이크포인트에서는 INT 1 이벤트를 사용한다. INT 1은 하드웨어 브레이크포인트를 위한 이벤트이며 단일 스텝 이벤트다. 단일 스텝은 각 명령을 하나씩 수행할 수 있다는 의미다. 이는 중요한 부분의 코드와 데이터의 변경 내용을 매우 세밀히 살펴볼 수 있게 한다.
하드웨어 브레이크포인트는 소프트 브레이크포인트와 동일한 방법으로 처리되지만 로우레벨에서 수행된다. CPU는 명령을 실행하기 전에 해당 주소가 하드웨어 브레이크포인트로 설정되어 있는지 먼저 확인한다. 또한 수행할 명령이 하드웨어 브레이크포인트가 설정된 주소에 접근하는지 여부를 확인한다. 해당 주소가 DR0~DR3 레지스터에 저장되어 있고 읽기/쓰기나 실행 조건이 설정되어 있다면 CPU는 명령에 대한 실행을 중지시키고 INT 1 이벤트를 발생시킨다. 해당 주소가 디버그 레지스터에 저장되어 있지 않다면 CPU는 해당 명령을 실행하고 다음 명령으로 이동해 하드웨어 브레이크 포인터 설정 내용을 다시 확인한다.
하드웨어 브레이크포인트는 매우 유용하지만 몇 가지 제약이 있따. 단지 4개의 개별적인 브레이크포인트를 설정할 수 있다는 것과 별개로 브레이크포인트를 설정할 수 있는 데이터의 최대 크기가 4바이트라는 점이다. 이는 큰 메모리 영역에 대한 버근을 추적하고자 하는 경우에는 맞지 않는다. 이런 한계를 극복하려면 메모리 브레이크포인트를 사용해야 한다.