원본 : http://www.debuglab.com/knowledge/int3.html
1.요약
INT 3 이라는 어셈블리 코드를 사용하여 사용자가 임의로 break pointer 를 추가해 보도록 하겠습니다.
2.본문
break pointer 는 특정 부분을 디버깅할때 사용하는 아주 유용한 툴(?)입니다. 그런데 디버깅을 단순히 사용하는데에 그치지 않고 break pointer 를 디버거가 어떻게 구현하는지 알아보기로 하겠습니다. 우선 디버거가 break pointer 를 구현할때에는 해당 라인에 INT 3 이라는 값을 넣어 둡니다. 그러면 INT 3 이라는 값이 이미 CPU 에서 break pointer 라고 정의되어 있기 때문에 디버거에 메세지가 날라와서 디버거가 그 메세지를 가지고 사용자에게 상태값들을 보여줄 수 있는 것이지요. 그럼 INT 3 이라는 값을 사용하여 맘대로 break pointer 를 걸어둘수는 없을까요? 네. 실제로 간단합니다.
그럼 구체적으로 살펴보기 위해서 우선 간단한 Console project 를 만들어 보시기 바랍니다.
그리고 나서 아래의 코드와 같이 입력하시고
그럼 프로그램이 a = 10; 에서 멈추겠지요?
그런데 이 부분을 아래와 같이 고쳐보기로 합시다.
실제로 해보세요.. 참고로 위에서 __asm {} 은 어셈블리 코드를 사용하겠다는 의미입니다.
그럼 여기에 머물지 말고 위의 코드를 보다 더 다양하게 사용하기 위한 방법을 알아볼까요?
위의 Break pointer 를 define 상수로 표현하면 훨씬 더 효과적이겠네요.^^.
#include "stdafx.h" 밑에
라고 입력하시고 프로그램을 실행해 보세요..
그럼 어떻게 되죠? 네.. 그렇습니다. user break pointer 가 걸립니다.
재밌죠?
이제 여러분은 디버깅을 하기 위해서 특정 부분에 위의 함수를 넣어두고, USER_DEBUG 를 선언하거나 선언하지 않음으로써 break pointer 를 막을 수 있게 되었습니다.
3.예제
- 2001.08.13 Smile Seo -
1.요약
INT 3 이라는 어셈블리 코드를 사용하여 사용자가 임의로 break pointer 를 추가해 보도록 하겠습니다.
2.본문
break pointer 는 특정 부분을 디버깅할때 사용하는 아주 유용한 툴(?)입니다. 그런데 디버깅을 단순히 사용하는데에 그치지 않고 break pointer 를 디버거가 어떻게 구현하는지 알아보기로 하겠습니다. 우선 디버거가 break pointer 를 구현할때에는 해당 라인에 INT 3 이라는 값을 넣어 둡니다. 그러면 INT 3 이라는 값이 이미 CPU 에서 break pointer 라고 정의되어 있기 때문에 디버거에 메세지가 날라와서 디버거가 그 메세지를 가지고 사용자에게 상태값들을 보여줄 수 있는 것이지요. 그럼 INT 3 이라는 값을 사용하여 맘대로 break pointer 를 걸어둘수는 없을까요? 네. 실제로 간단합니다.
그럼 구체적으로 살펴보기 위해서 우선 간단한 Console project 를 만들어 보시기 바랍니다.
그리고 나서 아래의 코드와 같이 입력하시고
int main(int argc, char* argv[])
{
int a;
a = 10; // 이곳에 Break pointer 를 걸어둡니다. (F9 키)
printf("Hello World!\n");
return 0;
}
자... 그리고 프로그램을 실행해보세요. 그럼 프로그램이 a = 10; 에서 멈추겠지요?
그런데 이 부분을 아래와 같이 고쳐보기로 합시다.
int main(int argc, char* argv[])
{
int a;
// a 의 값을 알고 싶기 때문에
// 여기에 break pointer 를 넣고 싶습니다.
__asm
{
INT 3
}
a = 10;
printf("Hello World!\n");
return 0;
}
자 그럼 어떻게 될까요? a = 10; 앞에 assembly 코드로 INT 3 이라는 값을 넣었죠? 그럼 디버거는 사용자가 임의로 break pointer 를 걸어놓았다는 메세지와 함께 해당 프로세스를 멈춥니다.. 실제로 해보세요.. 참고로 위에서 __asm {} 은 어셈블리 코드를 사용하겠다는 의미입니다.
그럼 여기에 머물지 말고 위의 코드를 보다 더 다양하게 사용하기 위한 방법을 알아볼까요?
위의 Break pointer 를 define 상수로 표현하면 훨씬 더 효과적이겠네요.^^.
#ifdef USER_DEBUG
// BREAK_POINTER 로 정의합니다.
#define BREAK_POINTER __asm \
{ \
INT 3 \
} \
#endif
int main(int argc, char* argv[])
{
int a;
// a 의 값을 알고 싶기 때문에
// 여기에 break pointer 를 넣고 싶습니다.
#ifdef USER_DEBUG
BREAK_POINTER
#endif
a = 10;
printf("Hello World!\n");
return 0;
}
위의 코드를 입력하고 실행하면 어떻게 될까요? 네 물론 break pointer 가 걸리지 않습니다. 이유는 USER_DEBUG 라는 상수가 정의 되어 있지 않기 때문인데요. #include "stdafx.h" 밑에
#define USER_DEBUG
라고 입력하시고 프로그램을 실행해 보세요..
그럼 어떻게 되죠? 네.. 그렇습니다. user break pointer 가 걸립니다.
재밌죠?
이제 여러분은 디버깅을 하기 위해서 특정 부분에 위의 함수를 넣어두고, USER_DEBUG 를 선언하거나 선언하지 않음으로써 break pointer 를 막을 수 있게 되었습니다.
3.예제
// 전체 소스
// Break.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define USER_DEBUG
#ifdef USER_DEBUG
// BREAK_POINTER 로 정의합니다.
#define BREAK_POINTER __asm \
{ \
INT 3 \
} \
#endif
inline void BreakPointer()
{
#ifdef USER_DEBUG
BREAK_POINTER
#endif
}
int main(int argc, char* argv[])
{
int a;
// a 의 값을 알고 싶기 때문에
// 여기에 break pointer 를 넣고 싶습니다.
BreakPointer();
a = 10;
printf("Hello World!\n");
return 0;
}
- 2001.08.13 Smile Seo -
"Win32 API" 카테고리의 다른 글
- 바탕화면, 즐겨찾기, 내 문서 등의 패스얻기 (0)2007/02/28
- 화면 보호기 제어하기 (0)2007/02/28
- Break Pointer 는 INT 3 으로 통한다!! (0)2007/02/22
- 화면 캡쳐 소스 (0)2007/02/22
- SearchPath()의 리턴값 알아보기 (0)2007/02/22
Tags breakpoint

수안이의 컴퓨터 연구실



Leave your greetings.