Trace implemnented by yourself will help you to debug your program. This is an example that uses OutputDebugString function. And DebugView will be the best choice to view the contents that Trace outputs.

1
2
3
4
5
6
7
8
9
10
//Trace.h
#pragma once

namespace CommonUtils {
	void Trace(const char* format, ...);
	void Trace(const wchar_t* format, ...);
	void ThreadTrace(const char* format, ...);
	void ThreadTrace(const wchar_t* format, ...);
	void TraceBytes(const unsigned char* buffer, unsigned long length, const char* prefix_format = nullptr, ...);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//Trace.cpp
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "trace.h"

void CommonUtils::Trace(const char* format, ...) {
	char msg[1024];
	va_list args;
	va_start(args, format);
	vsnprintf_s(msg, _countof(msg), _TRUNCATE, format, args);
	va_end(args);
	OutputDebugStringA(msg);
}

void CommonUtils::Trace(const wchar_t* format, ...) {
	wchar_t msg[1024];
	va_list args;
	va_start(args, format);
	_vsnwprintf_s(msg, _countof(msg), _TRUNCATE, format, args);
	va_end(args);
	OutputDebugStringW(msg);
}

void CommonUtils::ThreadTrace(const char* format, ...) {
	char msg[1024];
	va_list args;
	va_start(args, format);
	vsnprintf_s(msg, _countof(msg), _TRUNCATE, format, args);
	va_end(args);
	CommonUtils::Trace("[%.4d] %s", GetCurrentThreadId(), msg);
}

void CommonUtils::ThreadTrace(const wchar_t* format, ...) {
	wchar_t msg[1024];
	va_list args;
	va_start(args, format);
	_vsnwprintf_s(msg, _countof(msg), _TRUNCATE, format, args);
	va_end(args);
	CommonUtils::Trace(L"[%.4d] %s", GetCurrentThreadId(), msg);
}

void CommonUtils::TraceBytes(const unsigned char* buffer, unsigned long length, const char* prefix_format /*= nullptr*/, ...) {
	char prefix[512];
	if (prefix_format != nullptr) {
		va_list args;
		va_start(args, prefix_format);
		vsnprintf_s(prefix, _countof(prefix), _TRUNCATE, prefix_format, args);
		va_end(args);
	}

	const int cols = 32;
	char hex[cols * 3 + 1];
	char* cur = hex;
	for (unsigned long i = 0; i < length; i++) {
		sprintf_s(cur, 4, "%.2X ", buffer[i]);
		if ((((i + 1) % cols) == 0) || ((i + 1) == length)) {
			if (prefix_format != nullptr) {
				Trace("%s %s\n", prefix, hex);
			} else {
				Trace("%s\n", hex);
			}
			cur = hex;
		} else {
			cur += 3;
		}
	}
}