共用方式為


我可以自定義 DoTraceMessage 嗎?

是,您可以撰寫自己的 DoTraceMessage 宏版本。 DoTraceMessage 會產生追蹤訊息。

TraceDrv 範例驅動程式提供本主題所述的方法範例。 TraceDrv 可在 GitHub 上的 Windows 驅動程式範例 存放庫中取得。

DoTraceMessage:預設版本

根據預設,DoTraceMessage 宏的格式如下:

DoTraceMessage(Flag,"Message",MessageVariables...);

在此預設版本中, Flag 代表 追蹤旗標,這是產生訊息的條件。 MessageVariables 包含驅動程式定義且出現在追蹤訊息中的變數逗號分隔清單。 MessageVariables 變數是使用 printf 元素格式化。 WPP 預處理器會從 DoTraceMessage 宏建立編譯程式指示詞。 此宏會將訊息定義資訊和格式化資訊新增至為 追蹤提供者產生的 PDB 檔案,例如核心模式驅動程式或使用者模式應用程式。

DoTraceMessage 宏會以邏輯方式展開為下列專案:

PRE macro // If defined
If (WPP_CHECK_INIT && Flag is enabled) {
 ....Call WmiTraceMessage;
}
POST macro // If defined

請考慮下列程式碼範例。

DoTraceMessage(ERROR, "IOCTL = %d", ControlCode);

啟用 ERROR 旗標時,此呼叫會產生追蹤訊息。 訊息為 “IOCTL=%d”, MessageVariablesControlCode 的值。

如果已定義 PRE-logging 和 POST 記錄宏,它們也會展開。 Microsoft Windows 2000 和更新版本的操作系統支援 PRE 宏和 POST 宏。 若要使用宏,您必須使用WDK來建置驅動程式。 如果您使用舊版的 Windows 驅動程式開發工具包來建置驅動程式, (DDK) ,則無法使用 PRE 和 POST 功能,而且宏將不會在追蹤語句中執行。 使用舊版 Windows DDK 建置驅動程式可能不會造成組建中斷,但程式代碼無法如預期般運作。

DoTraceMessage:一般格式

以下是有效追蹤訊息函式的一般格式:

FunctionName(Conditions...,"Message",MessageVariables...);

訊息之前出現的參數會解譯為條件。 訊息之後出現的參數會解譯為訊息變數。

條件 是以逗號分隔的值清單。 只有在所有條件都成立時,才會產生追蹤訊息。 您可以指定程式代碼中支援的任何條件。

範例:MyTrace

以下是追蹤函式的範例。 本範例會新增追蹤層級的條件,以及產生追蹤訊息之提供者的子元件。

MyDoTrace(Level, Flag, Subcomponent,"Message",MessageVariables...);

例如:

MyDoTrace(TRACE_LEVEL_ERROR, VERBOSE, Network,"IOCTL = %d", ControlCode);

追蹤層級是在 Evntrace.h 中定義的標準層級,這是 WDK 的 Include 子目錄中的公用頭檔。

#define TRACE_LEVEL_NONE        0   // Tracing is not on
#define TRACE_LEVEL_FATAL       1   // Abnormal exit or termination
#define TRACE_LEVEL_ERROR       2   // Severe errors that need logging
#define TRACE_LEVEL_WARNING     3   // Warnings such as allocation failure
#define TRACE_LEVEL_INFORMATION 4   // Includes non-error cases(for example, Entry-Exit)
#define TRACE_LEVEL_VERBOSE     5   // Detailed traces from intermediate steps
#define TRACE_LEVEL_RESERVED6   6
#define TRACE_LEVEL_RESERVED7   7
#define TRACE_LEVEL_RESERVED8   8
#define TRACE_LEVEL_RESERVED9   9

如何建立自定義追蹤函式

若要建立自定義追蹤函式,請遵循下列步驟:

  • 撰寫支援 DoTraceMessage 宏的宏替代版本。

  • -func 參數新增至叫用 WPP 預處理器的 RUN_WPP 語句。

撰寫自定義宏

若要建立自定義追蹤函式,以變更追蹤訊息的條件, (出現在訊息) 之前的參數,您必須撰寫支持追蹤函式的替代宏版本, WPP_LEVEL_ENABLEDWPP_LEVEL_LOGGER

  • WPP_LEVEL_ENABLED (Flags) 判斷是否使用指定的旗標值啟用記錄。 它會傳回 TRUEFALSE

  • WPP_LEVEL_LOGGER (旗標) 會尋找啟用提供者的追蹤會話,並傳回追蹤會話的句柄。

例如,如果您想要包含追蹤層級,除了旗標之外,還有條件,請定義包含追蹤層級的新WPP_LEVEL_ENABLED宏。 您可以在默認宏上根據新宏的定義,如下列程式代碼範例所示。

#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >=lvl

一般而言,WPP_LEVEL_LOGGER宏不會受到影響。 在這些情況下,您可以將新的宏定義為預設宏。 例如:

#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) WPP_LEVEL_LOGGER(flags)

不過,在某些情況下,您必須變更LOGGER宏。 例如,您可能想要撰寫只取決於追蹤層級而非旗標的追蹤函式。

在下列程式代碼範例中,宏中的旗標值會取代為虛擬值。 宣告控件 GUID 定義時,不會定義旗標。

#define WPP_CONTROL_GUIDS \
   WPP_DEFINE_CONTROL_GUID(CtlGuid,(a044090f,3d9d,48cf,b7ee,9fb114702dc1),  \
        WPP_DEFINE_BIT(DUMMY))
#define WPP_LEVEL_LOGGER(lvl) (WPP_CONTROL(WPP_BIT_ ## DUMMY).Logger)

將函式新增至 WPP

若要將自定義追蹤函式新增至 WPP,請使用函式宣告將 -func 參數新增至 RUN_WPP 語句,如下列程式代碼範例所示。

RUN_WPP=$(SOURCES) -km -func:DoTraceLevelMessage(LEVEL,FLAGS,MSG,...)

注意 您不得在使用者模式應用程式或動態連結庫的 RUN_WPP 指示詞中指定 -km 參數, (DLL) 。

如需RUN_WPP選用參數的完整清單,請參閱 WPP 預處理器