大熊的口袋

 

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
//--debuginfo.cpp
#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 大熊的口袋 阅读(2827) 评论(1)  编辑 收藏 引用 所属分类: cpp

评论

# re: vc下格式化输出调试诊断信息(TRACE) 2009-11-06 11:22 喜乐递女性购物

吉萨汇商大厦  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

常用链接

留言簿(2)

随笔分类

随笔档案

win32 & debug

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜