在代码中添加跟踪记录

本页介绍了如何向 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

为事件设置时间

如果您需要为函数或过程计时,请参阅 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

向组件添加跟踪代码后,您现在可以从组件收集跟踪记录。如需了解详情,请参阅下一个记录并直观呈现跟踪记录页面。