Visual C++ Debugger가 Breakpoint를 감지하는 원리

Visual C++ Debugger는 Breakpoint를 어떻게 감지해내는 것일까? 원리는 아주 간단하다. 어셈블리어를 공부해보신 분들이라면 인터럽트라고 하는 기능을 들어본 적이 있을 것이다. Breakpoint를 지정한 부분에 인터럽트 코드를 삽입하여 컴파일하는 것이다. 그렇다면 우리가 직접 Breakpoint를 코딩으로 구현하는 것도 가능하지 않을까? 가능하다!

__asm
{
   int 3
}

위와 같은 코드를 실행해보면 Visual C++ Debugger가 정확히 해당 위치에서 멈추는 것을 볼 수 있다. 그러면 위와 같은 코드 대신 좀 더 직관적인 코드를 만드는법은 없을까? 매크로 구문을 이용하면 된다. 단, 이와 같은 구문은 디버그 모드에 한정하여 쓰는 것이 좋겠다.

#define BREAKPOINT __asm
{
   int 3
}

inline void SetBreakPoint(void)
{
   #ifdef DEBUG
       BREAKPOINT
   #endif
}

위와 같이 코드를 작성하고 따로 헤더 파일로 분리해 놓은 다음 SetBreakPoint 함수만 원하는 곳에 걸어두기만 하면 된다. SetBreakPoint 안에서 걸리는게 아니냐고 묻는다면 걱정하지 않아도 된다. 왜냐면 inline 함수이기때문이다. 익히 알다시피 inline 함수는 Call Stack에 영향을 주지 않는 함수이다.

그리고 SetBreakPoint 함수를 릴리즈 모드에서 사용할 경우 아무것도 실행하지 않게된다. 그러므로 #ifdef ~ #endif 전처리기 구문을 굳이 써놓지 않더라도 무방하다.

출처: http://www.debuglab.com/knowledge/int3.html

Visual C++ Debugger가 Breakpoint를 감지하는 원리”에 대한 1개의 생각

댓글 남기기