在代码中添加跟踪记录

本页介绍如何向 Fuchsia 组件代码添加跟踪功能。

前提条件

在开始之前,请确保您已完成以下任务:

在代码中使用跟踪宏

您的组件注册为跟踪提供程序后, 您可以在组件代码中添加跟踪

以下操作通常很有用,并且可以轻松地添加到代码中 使用跟踪宏:

有关所有可用跟踪宏的列表,请参阅 跟踪:C 和 C++ 宏

跟踪即时事件

以下示例(适用于 C 和 C++)写入了一个即时事件 代表一个时刻:

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

以下示例指定了类别 helloworld,名称为 hello_world_testTRACE_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

设置活动时间

如果您需要对某个函数或过程进行计时,请参阅下面的示例(适用于 C++) 从 blobfs vnode 构造函数中复制以下代码:

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

下例记录了在构造函数中花费的时间长度, 以及数据块的大小和数量由于这是一个 C++ 示例, 数据类型可以由编译器推断出来。

如需详细了解 TRACE_DURATION 宏,请参阅 TRACE_DURATION

向组件添加跟踪代码后,您现在可以 来自组件的跟踪记录如需了解更多信息,请参阅 记录并直观呈现轨迹页面。