다음을 통해 공유


crt_dbg2 샘플: C 런타임 디버깅 후크 함수

업데이트: 2007년 11월

crt_dbg2 샘플은 C 런타임 라이브러리의 디버그 버전과 함께 디버깅 후크 함수를 사용하는 여러 방법을 보여 줍니다. 사실성을 더하기 위해 이 샘플에는 버그 두 개를 비롯한 실제 응용 프로그램의 몇 가지 요소가 포함되어 있습니다.

참고:

이 샘플은 Intel의 Itanium 프로세서에서 지원되지 않습니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

이 샘플을 빌드하고 실행하려면

  1. crt_dbg2.sln 솔루션을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 선택합니다.

샘플 작동 방식

이 프로그램은 생일 정보를 클라이언트 블록의 연결 리스트에 저장합니다. 클라이언트 덤프 후크 함수는 생일 데이터의 유효성을 검사하고 클라이언트 블록의 내용을 보고합니다. 할당 후크 함수는 힙 작업을 텍스트 파일에 기록하고 보고서 후크 함수는 선택된 보고서를 같은 텍스트 파일에 기록합니다.

할당 후크 함수가 해당 로그에서 CRT 블록(C 런타임 라이브러리에 의해 내부적으로 할당된 메모리)을 명시적으로 제외한다는 점에 주의합니다. 후크 함수는 fprintf를 사용하여 로그 파일에 기록하고 fprintf는 CRT 블록을 할당합니다. 여기서 CRT 블록이 제외되지 않는다면 무한 루프가 스택 오버플로를 발생시킵니다. 즉, fprintf로 인해 후크 함수가 호출되고 후크가 fprintf를 호출하며 다시 이로 인해 후크가 호출되는 과정이 계속 반복됩니다.

C 런타임 함수 대신 Windows API 함수를 사용하면 응용 프로그램 후크의 CRT 형식 블록을 보고할 수 있습니다. Windows API는 CRT 힙을 사용하지 않기 때문에 후크를 무한 루프로 처리하지 않습니다.

두 번째 예제에서 디버그 힙은 두 개의 버그와 하나의 데이터 오류를 catch합니다. 첫 번째 버그는 생일 이름 필드의 크기가 여러 테스트 이름을 포함할 만큼 크지 않다는 것입니다. 필드가 더 커야 하고 strcpy 대신 strncpy를 사용해야 합니다. 두 번째 버그는 HeadPtr 자체가 null이 되기 전까지 printRecords 함수의 while 루프가 계속되어야 한다는 것입니다. 이 버그로 인해 생일이 불완전하게 표시되고 메모리 누수가 발생합니다. 마지막으로 Gauss의 생일은 4월 32일이 아니라 4월 30일이어야 합니다.

키워드

이 샘플에서는 다음의 키워드를 사용합니다.

_assert; _asserte; _crtcheckmemory; _crtmemcheckpoint; _crtmemdumpallobjectssince; _crtmemdumpstatistics; _crtsetallochook; _crtsetdbgflag; _crtsetdumpclient; _crtsetreportfile; _crtsetreporthook; _crtsetreportmode; _free_dbg; _malloc_dbg; _rpt4; _strdate; _strtime; aboutbox; clear_crt_debug_field; createinstance; createrecord; displaystring; donttouch; exit; fatalerror; fclose; fflush; fopen; fprintf; fputs; get_size; helpstring; id; iid_is; module; myallochook; mydumpclienthook; myreporthook; pointer_default; printf; printrecords; put_size; set_crt_debug_field; strcpy_s; strstr; uuid

참고 항목

기타 리소스

일반 샘플