2017-01-04 1 views
2

나는 OutputDebugString() 함수를 사용하는 타사 라이브러리를 사용하고 있으며 MSDN 설명서를 읽을 때 이것이 디버거로 인쇄하기위한 것임을 나타냅니다.콘솔의 OutputDebugString()

내 경우에는 불편합니다. 디버거가 연결되어 있지 않으면이 출력을 읽을 수있는 방법이 있습니까?

내 LIB 인 경우 사용자가 --debug 또는 그와 비슷한 값을 전달할 때마다 출력이 stdout/stderr로 이동하는 것이 좋지만 콘솔 (또는 파일)에이 정보를 전달할 다른 방법을 찾고 있기 때문에 출력이 stdout/디버거를 연결하지 않고.

+1

dbgview를 시도하면 출력 문자열을 캡처합니다. 많은 다른 기능이 있습니다. –

+0

"*이 출력 * 읽기"는 프로그래밍 방식으로 가능합니다 - 가능하면 DBG_PRINTEXCEPTION_ [WIDE_에 대해 VEX 핸들러와 스파이를 설정해야합니다. ] C' - 원하는 경우 콘솔에 'OutputDebugString'을 리디렉션하기위한 코드를 붙여 넣을 수 있습니다. 이것은 작고 간단하지만 – RbMm

+0

@ RbMm 확실합니다. 유용 할 수 있습니다. – Zitrax

답변

1

OutputDebugStringA 예외를 DBG_PRINTEXCEPTION_C (win10에서 W 버전 - DBG_PRINTEXCEPTION_WIDE_C)를 생성 - (문자 + 1, 문자열 포인터에 문자열 길이) -이 개 인수이 예외가 this을 위해 우리는이 예외 자신 (시스템 기본 핸들러를 처리 할 수있는 결과를). 리디렉션 OutputDebugString에 대한

예 핸들러는 콘솔 :

LONG NTAPI VexHandler(PEXCEPTION_POINTERS ExceptionInfo) 
{ 
    PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord; 

    switch (ExceptionRecord->ExceptionCode) 
    { 
    case DBG_PRINTEXCEPTION_WIDE_C: 
    case DBG_PRINTEXCEPTION_C: 

     if (ExceptionRecord->NumberParameters >= 2) 
     { 
      ULONG len = (ULONG)ExceptionRecord->ExceptionInformation[0]; 

      union { 
       ULONG_PTR up; 
       PCWSTR pwz; 
       PCSTR psz; 
      }; 

      up = ExceptionRecord->ExceptionInformation[1]; 

      HANDLE hOut = GetStdHandle(STD_ERROR_HANDLE); 

      if (ExceptionRecord->ExceptionCode == DBG_PRINTEXCEPTION_C) 
      { 
       // localized text will be incorrect displayed, if used not CP_OEMCP encoding 
       // WriteConsoleA(hOut, psz, len, &len, 0); 

       // assume CP_ACP encoding 
       if (ULONG n = MultiByteToWideChar(CP_ACP, 0, psz, len, 0, 0)) 
       { 
        PWSTR wz = (PWSTR)alloca(n * sizeof(WCHAR)); 

        if (len = MultiByteToWideChar(CP_ACP, 0, psz, len, wz, n)) 
        { 
         pwz = wz; 
        } 
       } 
      } 

      if (len) 
      { 
       WriteConsoleW(hOut, pwz, len - 1, &len, 0); 
      } 

     } 
     return EXCEPTION_CONTINUE_EXECUTION; 
    } 

    return EXCEPTION_CONTINUE_SEARCH; 
} 

및 세트

이 핸들러가 호출 할 필요가 :

AddVectoredExceptionHandler(TRUE, VexHandler); 

OutputDebugStringhere 등의 시스템 구현 - 그것은 정말으로 RaiseException라고 정확히이 인수는 예외 처리기에서만 MessageBox - 012라고 표시된 코드.