在程式碼中加入追蹤記錄

本頁說明如何在 Fuchsia 元件的程式碼中加入追蹤記錄。

必要條件

開始之前,請確認您已完成下列工作:

在程式碼中使用追蹤巨集

將元件註冊為追蹤程式後,您就可以在元件的程式碼中加入追蹤記錄。

以下是通常相當實用的動作,您可以使用追蹤巨集輕鬆加入程式碼:

如需所有可用追蹤巨集的清單,請參閱「追蹤:C 和 C++ 巨集」。

追蹤即時事件

下列範例 (適用於 C 和 C++) 會寫入代表單一時刻的即時事件:

TRACE_INSTANT("helloworld", "hello_world_test", TRACE_SCOPE_PROCESS, "message", TA_STRING("Hello, World!"));

這個範例指定了 helloworld 類別、hello_world_test 名稱、TRACE_SCOPE_PROCESS 的範圍,以及鍵/值組合。

如要進一步瞭解 TRACE_INSTANT 巨集,請參閱 TRACE_INSTANT

停用追蹤功能

在某些情況下,您可能想完全停用追蹤功能 (例如,即將發布元件時)。如果您在程式碼中加入 NTRACE 巨集,追蹤巨集將不會產生任何程式碼。

以下範例 (適用於 C 和 C++) 顯示 NTRACE 巨集:

#define NTRACE  // disable tracing
#include <lib/trace/event.h>

請務必在 #include 陳述式之前定義 NTRACE 巨集。

在以下範例中,rx_counttx_count 欄位僅適用於追蹤,因此如果 NTRACE 宣告了追蹤功能已停用,表示欄位不會佔用 my_statistics_t 結構的空間。

typedef struct {
#ifndef NTRACE  // reads as "if tracing is not disabled"
    uint64_t    rx_count;
    uint64_t    tx_count;
#endif
    uint64_t    npackets;
} my_statistics_t;

不過,如果您需要編譯程式碼以管理統計資料記錄,可以使用 TRACE_INSTANT 巨集:

#ifndef NTRACE
    status.tx_count++;
    TRACE_INSTANT("bandwidth", "txpackets", TRACE_SCOPE_PROCESS,
                  "count", TA_UINT64(status.tx_count));
#endif  // NTRACE

如要進一步瞭解 NTRACE 巨集,請參閱 NTRACE

判斷是否已啟用追蹤功能

在某些情況下,您可能需要判斷是否在執行階段開啟追蹤功能。如果因為 NTRACE 未定義,而在程式碼中編譯追蹤,TRACE_ENABLED() 巨集會判斷追蹤提供者的追蹤功能是否開啟。如果追蹤記錄已編譯,TRACE_ENABLED() 一律會傳回 false。

#ifndef NTRACE
    if (TRACE_ENABLED()) {
        int v = do_something_expensive();
        TRACE_INSTANT(...
    }
#endif  // NTRACE

上述範例 (適用於 C 和 C++) 同時使用 #ifndefTRACE_ENABLED() 巨集,因為在已停用追蹤功能的程式碼版本中,函式 do_something_expensive() 可能不存在。

如要進一步瞭解 TRACE_ENABLED 巨集,請參閱 TRACE_ENABLED

設定活動時間

如果您需要為特定函式或程序計時,請參閱 blobfs vnode 建構函式中的下方範例 (適用於 C++):

zx_status_t VnodeBlob::InitCompressed() {
    TRACE_DURATION("blobfs", "Blobfs::InitCompressed", "size", inode_.blob_size,
                   "blocks", inode_.num_blocks);
    ...

這個範例會記錄建構函式所花費的時間長度,以及區塊的大小和區塊數量。由於這是 C++ 範例,編譯器能夠推論資料類型。

如要進一步瞭解 TRACE_DURATION 巨集,請參閱 TRACE_DURATION

將追蹤程式碼加入元件後,您現在可以從元件收集追蹤記錄。詳情請參閱下一節「錄製追蹤記錄並以視覺化方式呈現」頁面。