如何跟踪函数入口和出口?
以下示例代码演示如何跟踪函数进入和退出调用。
首先,将 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 预处理器。