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 |