自己写了个函数追踪器

ACE中有一个很有用的宏叫做ACE_TRACE
把它放在函数的开头,那么在进入和离开这个函数的时候它就会分别打印出一条Message.
例如

int main(){
   ACE_TRACE("main");
}

调试程序的时候相当有用。
However,自ACE5.5之后,默认就disable了TRACE功能,且ACE越来越庞大(编译后的体积已经远大于WxWidget等,超过 1G),于是我就利用Loki写了一个轻巧的实现。

#include <loki/ScopeGuard.h>
/*! 原来的Loki库的这两个macro有些问题,我就只好自己重写下咯 */
#ifdef __GNUC__
#define S_ON_BLOCK_EXIT      Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) __attribute__ ((unused)) = Loki::MakeGuard
#define S_ON_BLOCK_EXIT_OBJ  Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) __attribute__ ((unused)) = Loki::MakeObjGuard
#else
#define S_ON_BLOCK_EXIT      Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) = Loki::MakeGuard
#define S_ON_BLOCK_EXIT_OBJ  Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) = Loki::MakeObjGuard
#endif

struct SourceInfo{
    std::string file;
    long line;
    std::string func;
};

void enter_function(const SourceInfo& info){
    std::cout<<"进入"<<info.func<<"函数"<<std::endl;
}

void leave_function(const SourceInfo& info){
    std::cout<<"离开"<<info.func<<"函数"std::endl;
}

#define FUNCTION_TRACE(X) \
    SourceInfo __XX_info_XX={__FILE__,__LINE__,X}; \
    enter_function(__XX_info_XX); \
    S_ON_BLOCK_EXIT(leave_function,__XX_info_XX);

如果需要的话,还可以打印出详细的文件,行号,堆栈调用情况等等

用法类似

int main(){
   FUNCTION_TRACE("main");
}

gcc下可以这样

#define TRACE_FUNC \
   FUNCTION_TRACE(__func__);

然后就

int main(){
   TRACE_FUNC
   ///开始写你的代码
}

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥