vc下格式化輸出調試診斷信息(TRACE)
最近在將一個dll工程從一個大的項目里抽出來,避免依賴其他的亂七八糟的lib和dll,作為一個獨立的dll工程。將包含工程文所有主要代碼的文件夾拷出來一編譯,問題一大堆,其中最扎眼的要數TRACEA()TRACEW()TRACEW1()TRACEW2()這些未定義的宏了。想把原先的宏定義拉過來,卻總覺得這些TRACE1、2之類的實在是不太雅觀。并且如果依賴原先的實現可能要要再帶一個dll(那我抽出來的目的是什么?),遂自己實現了一個任意個參數的TRACE宏,廢話少說,上代碼:// --debuginfo.h
#ifndef __DEBUG_INFO_H__
#define __DEBUG_INFO_H__
#ifndef NDEBUG
#define TRACEA ((void)0)
#define TRACEW ((void)0)
#else
VOID _cdecl _traceA(const char *msgFmt,
);
VOID _cdecl _traceW(const wchar_t *msgFmt,
);
#define TRACEA _traceA
#define TRACEW _traceW
#endif
#endif
#include "debuginfo.h"
#include <stdlib.h>
#include <Windows.h>
#ifndef NDEBUG
__declspec(thread) unsigned retAddrForTraceA = 0;
__declspec(thread) char tszBuf[512] =
{0};
__declspec(thread) unsigned retAddrForTraceW = 0;
__declspec(thread) wchar_t tswzBuf[512] =
{0};

static unsigned *GetAddrOfRetAddrForTraceA()

{
return &retAddrForTraceA;
}
static unsigned *GetAddrOfRetAddrForTraceW()

{
return &retAddrForTraceW;
}
static char *GetAddrOftszBuf()

{
return &tszBuf[0];
}
static wchar_t *GetAddrOftswzBuf()

{
return &tswzBuf[0];
}

_declspec(naked) VOID _traceA(const char *msgFmt,
)

{
__asm
{
call GetAddrOfRetAddrForTraceA;
pop ebx;
mov [eax], ebx;
call GetAddrOftszBuf;
push eax;
call dword ptr [wsprintfA];
call dword ptr [OutputDebugStringA];
call GetAddrOfRetAddrForTraceA;
push [eax];
ret;
}
}
_declspec(naked) VOID _traceW(const wchar_t *msgFmt,
)

{
__asm
{
call GetAddrOfRetAddrForTraceW;
pop ebx;
mov [eax], ebx;
call GetAddrOftswzBuf;
push eax;
call dword ptr [wsprintfW];
call dword ptr [OutputDebugStringW];
call GetAddrOfRetAddrForTraceW;
push [eax];
ret;
}
}
#endif這個trace是線程安全的。避免了自己去分析格式字符串。
終于,工程再編譯一次,結果安靜多了...
posted on 2009-11-04 16:35 大熊的口袋 閱讀(3153) 評論(1) 編輯 收藏 引用 所屬分類: cpp

