티스토리 뷰

Project/Windows Debugger

Single Step 구현

Tribal 2016. 9. 30. 23:47

Single Step 구현에 관한 내용들이다.


EXCEPTION_RECORD 이벤트 예외목록 참고

※ MSDN : https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363082(v=vs.85).aspx


Debugging Events 목록 참고

※ MSDN : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms679302(v=vs.85).aspx


Single Step 참고

※ MSDN : http://mapview.tistory.com/entry/%EB%94%94%EB%B2%84%EA%B1%B0-single-step-%EA%B5%AC%ED%98%84



  Single Step의 설정은 매우 간단하다.


  우선 Flag Register의 Trap bit의 역할에 대해서 알아야 한다. Trap과 비슷한 녀석으로 Exception이 있다. Exception은 예외가 발생했을 경우 예외처리 핸들러를 통해 예외처리를 실행하지만 Trap은 약간 다르다. 덫이라는 의미를 그대로 이해하면 쉬워지는데 Trap이 설정된 경우 무조건 Trap에 대한 핸들러를 실행하게 된다.

  설정 방법은 아래의 Flag Register의 TF(Trap Flag)를 세팅해주면 끝난다. 해제는 반대로 TF를 세팅 해제해주면 된다.


  Single Step이 발생하게 되면 DEBUG_EVENT 구조체의 dwDebugEventCode가 EXCEPTION_DEBUG_EVENT(상수 값 : 1)로 세팅되고 DEBUG_EVENT 구조체에서 u.Exception.ExceptionRecord.ExceptionCode 를 따라 들어가게 되면 예외처리 코드 항목을 확인할 수 있다.


Single Step 세팅 및 해제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
BOOL Set_SingleStep()
{
    Context.EFlags |= 0x100 ;    //Trap bit
    if(!SetThreadContext(hThread,&g_context))    //Context의 내용을 스레드에 적용
    {
        g_context.EFlags ^= 0x100;                //만약 세팅에 실패한 경우 원상태로 복구
        return FALSE;
    }
    return TRUE;
}
 
BOOL Delete_SingleStep()
{
    Context.EFlags ^= 0x100 ;    //Trap bit
    if(!SetThreadContext(hThread,&g_context))
    {
        g_context.EFlags |= 0x100;
        return FALSE;
    }
    return TRUE;
}
 
cs


Single Step 예외 처리 확인 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ContinueDebugEvent(g_de.dwProcessId, g_de.dwThreadId, DBG_CONTINUE);        //Debug Event 진행을 알림
 
if(WaitForDebugEvent(&g_de, 100== NULL)                                    //Debug Event 발생 대기
{
    return TRUE;
}
 
switch(DEBUG_EVENT.dwDebugEventCode)
{
    case EXCEPTION_DEBUG_EVENT:            // 상수 값 : 1
        switch{DEBUG_EVENT.u.Exception.ExceptionRecord.ExceptionCode)
        {
        case EXCEPTION_SINGLE_STEP:                                            //Single Step!
            puts("It's Single Step Handler!!");
            break;
        }
        break;
}
cs



구현해보면 생각보다 별로 어렵지 않은 것을 알 수 있다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31