RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'breakpoint'에 해당되는 글 2
원본 : 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 를 만들어 보시기 바랍니다.

그리고 나서 아래의 코드와 같이 입력하시고

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 -
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/02/22 10:58 2007/02/22 10:58
http://www.webdizen.net/blog/trackback/2630
[로그인][오픈아이디란?]
원본 : http://www.debuglab.com/knowledge/dllbreakpoint.html

1. 요약

DirectPhone의 경우 3개의 프로젝트가 1개의 워크스페이스에 들어있습니다. 두 개는 Dll이고 하나는 exe 입니다. Exe 프로젝트가 active project인 상태에서 Dll 내의 특정 위치에 break point를 설정한 채로 프로그램을 실행시킨다면( F5) break point는 disable 될 것입니다. 해결책을 알아봅시다.


2. 본문

exe 프로젝트에게 해당 dll을 사용하고 있음을 인식시켜준다면 문제는 해결될 것입니다.

Exe 의 프로젝트 세팅에 가셔서( Alt-F7) [Debug] 탭을 선택하신 후에 [Category] 콤보 박스에서 [Additional Dlls]를 선택하시고 사용하고 있는 dll 파일의 위치를 선택해 주시면 됩니다.

이제는 active project가 아닌 Dll에도 마음대로 breakpoint를 설정하실 수 있습니다.


사용자 삽입 이미지



3. 예제 코드

없슴


4. 참조

Debuggin Applications John Robbins [Microsoft press]



- 2001.08.13 Smile Seo -
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/02/22 09:09 2007/02/22 09:09
http://www.webdizen.net/blog/trackback/2623
[로그인][오픈아이디란?]
webdizen:이 세상에 존재하는 모든 데이터를 체계화하고, 효과적으로 분석하는 그 날까지 이 재미난 연구를 계속해 나갈 생각입니다.

현재 OLAP, Data Warehouse, Data Mining, Cloud Computing, MapReduce, Data Modeling에 대해서 연구하고 있습니다.
이 세상에 존재하는 모든 데이터를 체계화하고, 효과적으로 분석하는 그 날까지 이 재미난 연구를 계속해 나갈 생각입니다. 현재 OLAP, Data Warehouse, Data Mining, Cloud Computing, MapReduce, Data Modeling에 대해서 연구하고 있습니다.
전체 (3018)
Webdizen (145)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Cloud Computing (3)
Programming (807)
Data Modeling (0)
Database (105)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (80)
Security (91)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
«   2010/09   »
      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    
  1. yundream의 프로그래밍 이야기  03/10
    printf,scanf를 이용한 형식화된 입출력
  2. 은마군의 나태블록  2009
    파일 열기/저장하기 CFileDialog
  3. 상우 :: Oranzie's BLOG  2008
    World IT Show 2008
  4. 3인3색  2008
    cvs서버 설치하기
  5. PHP와 Web 2.0  2007
    속속 공개되는 Google Chart Maker
  1. 2010/09 (2)
  2. 2010/08 (2)
  3. 2010/07 (2)
  4. 2010/05 (1)
  5. 2010/04 (2)