다음을 통해 공유


디버거 및 Logexts.dll 사용

로거를 활성화하는 한 가지 방법은 CDB 또는 WinDbg를 시작하고 평소와 같이 사용자 모드 대상 애플리케이션에 연결하는 것입니다. 그런 다음 !logexts.logi 또는 !logexts.loge 확장 명령을 사용합니다.

그러면 대상 애플리케이션 프로세스에서 Logexts.dll 로드하고 초기화하는 루틴으로 이동하는 코드가 현재 중단점에 삽입됩니다. 이를 "대상 애플리케이션에 로거 삽입"이라고 합니다.

이 모듈은 디버거 확장 DLL과 대상 애플리케이션에 삽입되는 프로그램이므로 실제로 실행 중인 Logexts.dll 두 개의 인스턴스가 있습니다. Logexts.dll 디버거 및 대상 인스턴스는 출력 파일 핸들, 현재 범주 마스크 및 로그 출력 버퍼에 대한 포인터를 포함하는 메모리의 공유 섹션을 통해 통신합니다.

대상 애플리케이션에 연결

대상 애플리케이션에 디버거를 연결하는 방법에 대한 자세한 내용은 WinDbg를 사용하여 User-Mode 프로세스 디버깅 또는 CDB를 사용하여 User-Mode 프로세스 디버깅을 참조하세요.

로거 확장 명령 사용

각 확장의 전체 구문은 해당 참조 페이지를 참조하세요.

!logexts.logi
대상 애플리케이션에 로거를 삽입합니다. 이렇게 하면 로깅이 초기화되지만 사용하도록 설정되지는 않습니다.

!logexts.loge
로깅을 사용하도록 설정합니다. !logexts.logi를 사용하지 않은 경우 이 확장이 초기화되고 로깅을 사용하도록 설정합니다.

!logexts.logd
로깅을 사용하지 않도록 설정합니다. 이렇게 하면 프로그램을 자유롭게 실행할 수 있도록 모든 API 후크가 제거됩니다. COM 후크는 언제든지 다시 사용하도록 설정할 수 없으므로 제거되지 않습니다.

!logexts.logo
출력 옵션을 표시하거나 수정합니다. 디버거, 텍스트 파일 또는 .lgv 파일로 직접 전송되는 메시지의 세 가지 출력 유형이 가능합니다. .lgv 파일에는 다른 두 파일보다 훨씬 더 많은 정보가 포함되어 있습니다. LogViewer를 사용하여 읽을 수 있습니다.

텍스트 파일 출력을 사용하지 않도록 설정하면 크기가 0인 .txt 파일이 계속 만들어집니다. 이렇게 하면 이전에 저장한 텍스트 파일을 동일한 위치에 덮어쓸 수 있습니다.

!logexts.logc
사용 가능한 API 범주를 표시하고, 기록할 범주와 기록되지 않을 범주를 제어하고, 모든 범주에 포함된 API를 표시합니다.

범주를 사용하지 않도록 설정하면 더 이상 성능 오버헤드가 없도록 해당 범주의 모든 API에 대한 후크가 제거됩니다. COM 후크는 언제든지 다시 사용하도록 설정할 수 없으므로 제거되지 않습니다.

특정 범주만 사용하도록 설정하면 프로그램이 Windows와 갖는 특정 유형의 상호 작용(예: 파일 작업)에만 관심이 있는 경우에 유용할 수 있습니다. 이렇게 하면 로그 파일 크기가 줄어들고 로거가 프로세스의 실행 속도에 미치는 영향도 줄어듭니다.

!logexts.logb
현재 출력 버퍼를 표시하거나 플러시합니다. 성능 고려 사항으로 로그 출력은 출력 버퍼가 가득 찬 경우에만 디스크로 플러시됩니다. 기본적으로 버퍼는 2144바이트입니다.

버퍼 메모리는 대상 애플리케이션에서 관리되므로 대상 애플리케이션에 액세스 위반 또는 복구할 수 없는 다른 오류가 있는 경우 디스크의 로그 파일에 버퍼의 자동 쓰기가 발생하지 않습니다. 이러한 경우 이 명령을 사용하여 버퍼를 디스크에 수동으로 플러시해야 합니다. 그렇지 않으면 가장 최근에 기록된 API가 로그 파일에 나타나지 않을 수 있습니다.

!logexts.logm
모듈 포함/제외 목록을 표시하거나 만듭니다. 특정 모듈 또는 모듈 집합에서 만든 API 호출만 기록하는 것이 좋습니다. 이를 위해 Logger를 사용하면 모듈 포함 목록 또는 모듈 제외 목록을 지정할 수 있습니다. instance 경우 하나 또는 두 개의 모듈에서만 호출을 기록하려는 경우 포함 목록을 사용합니다. 짧은 모듈 목록을 제외한 모든 모듈에서 수행한 호출을 기록하려는 경우 제외 목록을 사용합니다. Logexts.dll 및 Kernel32.dll 모듈은 로거가 로그할 수 없으므로 항상 제외됩니다.