Published 2020. 11. 13. 10:47

1. Trace는 단순한 추적 기능을 구현하는 것을 말한다.

 

2. printf는 출력을 디버거로 보내지 않기 때문에 부적절하다.

 

3. OutputDebugString 함수는 커널을 통해서 디버거에 문자열을 전달할 수 있지만, 릴리즈 버전에서는 노출되지 않는다.

 

4. Event Tracing은 릴리즈 버전에서도 제어 및 활성화할 수 있는 강력한 기능을 제공하지만, 간단한 추적을 하기에는 적합하지 않다.

 

#pragma once

#include <stdio.h>
#include <crtdbg.h>
#include <Windows.h>

#define ASSERT _ASSERTE

#ifdef _DEBUG
#define VERIFY ASSERT
#else
#define VERIFY(expression) (expression)
#endif


#ifdef _DEBUG
inline auto Trace(wchar_t const* format, ...) -> void
{
    va_list args;
    va_start(args, format);

    wchar_t buffer[256];

    ASSERT(-1 != _vsnwprintf_s(buffer,
        _countof(buffer) - 1,
        format,
        args));

    va_end(args);

    OutputDebugString(buffer);
}

struct Tracer
{
    char const* m_filename;
    unsigned m_line;

    Tracer(char const* filename, unsigned const line) :
        m_filename{ filename },
        m_line{ line }
    {

    }

    template <typename... Args>
    auto operator()(wchar_t const* format, Args... args) const -> void
    {
        wchar_t buffer[256];

        auto count = swprintf_s(buffer,
            L"%S(%d): ",
            m_filename,
            m_line);

        ASSERT(-1 != count);

        ASSERT(-1 != _snwprintf_s(buffer + count,
            _countof(buffer) - count,
            _countof(buffer) - count - 1,
            format,
            args...));

        OutputDebugString(buffer);
    }
};

#endif

#ifdef _DEBUG
#define TRACE Tracer(__FILE__, __LINE__)
#else
#define TRACE __noop
#endif

auto main() -> int
{
    TRACE(L"1 + 2 = %d\n", 1 + 2);
}

'삽질 > COM' 카테고리의 다른 글

RTTI  (0) 2022.07.15
Verify  (0) 2020.11.13
COM study note 8 IUnknown C# 버전  (0) 2020.10.30
COM study note 8 IUnknown 이식  (0) 2020.10.30
COM study note 7  (0) 2020.10.29
복사했습니다!