如何跟踪函数入口和出口?

以下示例代码演示如何跟踪函数进入和退出调用。

首先,将 WPP_CONTROL_GUIDS 宏的定义添加到源或头文件。 定义 跟踪标志时,请为函数跟踪定义标志,如以下示例所示:

#define WPP_CONTROL_GUIDS \
    WPP_DEFINE_CONTROL_GUID(CtlGuid,(a044090f,3d9d,48cf,b7ee,9fb114702dc1),  \
        WPP_DEFINE_BIT(ERROR)                \
        WPP_DEFINE_BIT(Unusual)              \
        WPP_DEFINE_BIT(Noise)                \
 WPP_DEFINE_BIT(FuncTrace) )

然后,在同一文件中,添加跟踪消息的配置数据。 使用 begin_wpp config 语句启动配置数据,并使用 end_wpp 语句结束。 然后添加支持 FuncTrace 的宏的定义。

// begin_wpp config
// FUNC FuncEntry();
// FUNC FuncExit();
// USESUFFIX(FuncEntry, " Entry to %!FUNC!");
// USESUFFIX(FuncExit, " Exit from %!FUNC!");
// end_wpp

// Map the null flags used by Entry/Exit to a function called FuncTrace
#define WPP__ENABLED() WPP_LEVEL_ENABLED(FuncTrace)
#define WPP__LOGGER() WPP_LEVEL_LOGGER(FuncTrace)

在源文件中,使用 FuncEntry () FuncExit () 调用将函数代码括起来。

#include "mytrace.h"
#include "entryexit.tmh"
void examplesub(int x)
{
    FuncEntry();
    // function code
    FuncExit();
}

例如:

#include "mytrace.h"
#include "entryexit.tmh"
void examplesub(int x)
{
    FuncEntry();
       DoTraceMessage(Noise, "Value is %d",x);
    FuncExit();
}

如果将配置数据放在头文件中,请使用 -scan 参数指示 WPP 在指定文件中查找配置数据。 在此示例中,配置数据位于 mytrace.h 文件中。

RUN_WPP=$(SOURCES) -km -scan:mytrace.h

注意 不得在用户模式应用程序或动态链接库的 RUN_WPP 指令中指定 -km 开关, (DLL) 。

有关RUN_WPP的可选参数的完整列表,请参阅 WPP 预处理器