피드로 돌아가기
Dev.toInfrastructure
원문 읽기
RFLAGS Trap Flag 조작을 통한 CPU 레벨 Single-Step 디버깅 구현
Working on Single-Step Breakpoints in a Debugger
AI 요약
Context
특정 주소에서만 트리거되는 Hardware Breakpoint의 한계를 극복하고 모든 명령어를 순차적으로 추적하는 Single-Step 메커니즘 필요성 대두. CPU 레벨에서 실행 흐름을 제어하여 명령어 단위의 정밀한 상태 분석을 수행하는 구조 설계.
Technical Solution
- RFLAGS 레지스터의 TF(Trap Flag) 비트를 활용한 명령어 단위 예외 발생 유도
- MOV 명령어로 직접 수정 불가능한 TF 제어를 위해 Stack에 저장된 RFLAGS 복사본을 수정하는 간접 조작 방식 채택
- #DB Exception 발생 시 CPU가 자동으로 TF를 Clear 하여 핸들러 내부의 무한 재귀 루프를 방지하는 하드웨어 메커니즘 활용
- DR6 레지스터의 BS(Single-Step Bit)를 검증하여 Hardware Breakpoint와 Single-Step 이벤트를 구분하는 분기 로직 설계
- IRETQ 실행 전 Stack 내 TF 비트를 다시 1로 설정함으로써 핸들러 복귀 후 즉시 다음 명령어에서 예외가 발생하도록 제어
- step_count 변수를 통한 루프 횟수 제한으로 정해진 명령어 범위 내에서만 Single-Step이 동작하도록 설계
실천 포인트
- Low-level 디버거 설계 시 하드웨어 레지스터의 직접 수정 가능 여부와 간접 수정 경로(Stack Frame 등)를 우선 확인하십시오. - 인터럽트 핸들러 내에서 동일한 예외가 반복 발생하는 Recursive Exception Loop 방지책이 설계에 포함되었는지 검토하십시오. - DR6와 같은 상태 레지스터의 비트 필드를 통해 이벤트의 발생 원인을 명확히 구분하는 상태 머신을 구축하십시오.