链接方法调用

时间:2010-09-27 10:23:07

标签: c++ tracing

我必须为现有方法定义一组新的包装器。 这些新的包装器旨在通过包含某些跟踪信息来帮助调试。

源代码:

Sample.c ::

Caller{

void functionA(){
    funcB();
}

}

Callee{

void funcB(){
}
}

使用传统包装功能修改的代码:

Sample.h ::

#define funcB wrapperFuncB //not visible to Callee

Caller{

void functionA(){ //this gets redirected to wrapperFuncB cos of #define
    funcB();
}
}
Callee{

void wrapperFuncB(){
    if(DEBUG){ //value of DEBUG is set at runtime 
        //COLLECT Trace data


    }else{
        funcB();
    }
}
void funcB(){
}
}

此机制具有以下额外开销: 1]对funcB的所有调用都被路由到wrapperFuncB,不管是否启用了DEBUG 2]必须创建另一个方法frame [wrapperFuncB],不管是否启用了DEBUG 3]条件检查的开销

3 个答案:

答案 0 :(得分:1)

如果方法相同,您可以使用以下内容:

#ifdef __DEBUGING
#define myClass debug_class
#else
#define myClass actual_class
#endif

通过这种方式,您可以有选择地选择在代码中使用的类,实际的或者包装类。可能会有一些问题,因为这只是我想到的第一个想法。

答案 1 :(得分:1)

或者你可以把你的调试语句放在这个

#ifdef DEBUG_ENABLE
DEBUG_LOG(X)  printf(x)
#else
DEBUG_LOG(X) do{}while(0)

void FunctionA()
{
DEBUG_LOG("\n Debugging function",__func__);
}

您可以使用相同的例程而不使用包装器。优点是日志会使代码更容易理解,您可以使用编译器选项启用和禁用它们。

答案 2 :(得分:0)

由于函数wrapperFuncB将具有与funcB相同的签名,因此您可以在不需要新类的情况下执行此操作。

#ifdef __DEBUG__
#define funcB wrapperFuncB
#else
#define funcB actualFuncB
#end

因此,当您不调试或收集跟踪信息时,您可以通过不定义 DEBUG 来关闭它,并且不会产生任何开销

编辑:从用户170008获取评论后更新

我不认为#ifdef __DEBUG__可以在运行时使用某种东西。最有可能的是,您将不得不依赖命令行参数来区分调试或正常运行。 但是你使用的方法只是创建一个函数指针并根据你正在进行的运行类型设置它,例如

void (*funcB)(void);
if(debug)  
    funcB=debugFuncB;
else
    funcB=actualFuncB;

之后你可以简单地使用你现在使用的funcB,即funcB();