Visual Studio에서 출력 창에 쓰는 방법은 무엇입니까?


79

Visual Studio의 "출력"창에 텍스트를 출력하려면 어떤 함수를 사용해야합니까?

시도 printf()했지만 표시되지 않습니다.

답변:


84

OutputDebugString 함수가이를 수행합니다.

예제 코드

    void CClass::Output(const char* szFormat, ...)
{
    char szBuff[1024];
    va_list arg;
    va_start(arg, szFormat);
    _vsnprintf(szBuff, sizeof(szBuff), szFormat, arg);
    va_end(arg);

    OutputDebugString(szBuff);
}

3
이것에 여전히 문제가 있습니다. _vsnprintf는 버퍼에 맞게 형식화 된 문자열을자를 수 있지만이 경우 문자열은 널로 종료되지 않습니다. msdn.microsoft.com/en-us/library/1kt27hek.aspxstackoverflow.com/questions/357068을 참조 하십시오 .
ChrisN

컴파일러 옵션에서 멀티 바이트 문자 세트를 사용하고 있습니다. 그런 다음 멀티 바이트 버전을 사용해야합니다.WCHAR szBuff[1024] _vsnwprintf
Lefteris E

경고 1 경고 C4996 : '_vsnwprintf':이 함수 또는 변수는 안전하지 않을 수 있습니다. 대신 _vsnwprintf_s 사용을 고려하십시오. ;-)
hfrmobile

1
OutputDebugString이 작동하도록하려면 #include가 필요합니까?
Michele

있는 Windows.h 포함
ΦXocę 웃 Пepeúpaツ

72

이것이 디버그 출력 인 경우 OutputDebugString 이 원하는 것입니다. 유용한 매크로 :

#define DBOUT( s )            \
{                             \
   std::ostringstream os_;    \
   os_ << s;                   \
   OutputDebugString( os_.str().c_str() );  \
}

이렇게하면 다음과 같이 말할 수 있습니다.

DBOUT( "The value of x is " << x );

더 많은 정보를 제공하기 위해 __LINE____FILE__매크로를 사용하여이를 확장 할 수 있습니다 .

Windows 및 와이드 캐릭터 랜드 사용자 :

#include <Windows.h>
#include <iostream>
#include <sstream>

 #define DBOUT( s )            \
{                             \
   std::wostringstream os_;    \
   os_ << s;                   \
   OutputDebugStringW( os_.str().c_str() );  \
}

1
이 진술을 조금 설명해 주시겠습니까? - " 더 많은 정보를 제공하기 위해 LINEFILE 매크로를 사용하여이를 확장 할 수 있습니다 ."
유수프 아자 드

2
@ sami1592이 두 매크로는 컴파일러에 의해 (놀라운) 줄과 파일로 정의되므로 줄과 파일을 포함하는 더 유용한 로그를 자동으로 출력 할 수 있습니다.
ZachB

20

다음과 같이 형식을 지정할 수 있는 OutputDebugString함수 또는 TRACE매크로 (MFC)를 사용합니다 printf.

int x = 1;
int y = 16;
float z = 32.0;
TRACE( "This is a TRACE statement\n" );    
TRACE( "The value of x is %d\n", x );
TRACE( "x = %d and y = %d\n", x, y );
TRACE( "x = %d and y = %x and z = %f\n", x, y, z );

Visual Studio의 컴파일러가 ALTTRACE2 또는 ALTTRACE를 인식하지 않습니다. #include가 필요한가요? MFC 프로젝트가 아니기 때문입니까? 나에게는 C ++뿐입니다.
Michele

Visual Studio 2017, C ++에서 오래된 3DES 알고리즘을 테스트하고있었습니다. 모든 "printf"를 "TRACE"로 대체하여 코드가 작동하도록했습니다. 아주 좋은 히트! 감사합니다!
Paul

3

유용한 팁- 디버그를 다음 __FILE____LINE__같이 사용 하고 포맷 하는 경우 :

"file(line): Your output here"

그런 다음 출력 창에서 해당 줄을 클릭하면 Visual Studio가 해당 코드 줄로 직접 이동합니다. 예 :

#include <Windows.h>
#include <iostream>
#include <sstream>

void DBOut(const char *file, const int line, const WCHAR *s)
{
    std::wostringstream os_;
    os_ << file << "(" << line << "): ";
    os_ << s;
    OutputDebugStringW(os_.str().c_str());
}

#define DBOUT(s)       DBOut(__FILE__, __LINE__, s)

나는 이것에 대한 블로그 게시물을 썼기 때문에 나는 그것을 찾을 수있는 곳을 항상 알았다 : https://windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio.html


0

afxDump 대신 OutputDebugString을 사용하십시오.

예:

#define _TRACE_MAXLEN 500

#if _MSC_VER >= 1900
#define _PRINT_DEBUG_STRING(text) OutputDebugString(text)
#else // _MSC_VER >= 1900
#define _PRINT_DEBUG_STRING(text) afxDump << text
#endif // _MSC_VER >= 1900

void MyTrace(LPCTSTR sFormat, ...)
{
    TCHAR text[_TRACE_MAXLEN + 1];
    memset(text, 0, _TRACE_MAXLEN + 1);
    va_list args;
    va_start(args, sFormat);
    int n = _vsntprintf(text, _TRACE_MAXLEN, sFormat, args);
    va_end(args);
    _PRINT_DEBUG_STRING(text);
    if(n <= 0)
        _PRINT_DEBUG_STRING(_T("[...]"));
}

0
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());

#include <string>
Andrew

0

OutputDebugString실제로 디버거 콘솔에 문자열을 인쇄 하지만 printf후자가 %표기법과 가변 개수의 인수를 사용하여 인수를 형식화 할 수 있다는 점 과 는 정확히 같지 OutputDebugString않습니다.

나는 적어도 인수가 있는 _RPTFN매크로 _CRT_WARN가이 경우에 더 나은 구혼 자라고 주장 할 것입니다. 즉, printf디버거 콘솔에 결과를 기록하는 것처럼 주 문자열을 형식화합니다 .

그것에 대한 사소한 (그리고 이상한, 내 생각에) 경고 는 형식 문자열 다음 에 적어도 하나의 인수 가 필요하다는 것 입니다 (모두 %for 대체를 가진 인수 ), 제한 printf이 발생하지 않습니다 .

puts유사한 기능 이 필요한 경우 ( 형식 지정없이 문자열을 그대로 작성하는 경우) 형제가 있습니다 _RPTF0(형식 문자열 다음에 오는 인수를 무시하는 또 다른 이상한 경고). 또는 OutputDebugString물론.

그건 그렇고, 또한 거기에서 모든 것 _RPT1_RPT5하지만 난 그들을 시도하지 않았습니다. 솔직히, 왜 그렇게 많은 절차를 기본적으로 모두 동일한 작업을 수행하는지 이해하지 못합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.