本页介绍如何向 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_count
和 tx_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++)同时使用了 #ifndef
和
TRACE_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
。
向组件添加跟踪代码后,您现在可以 来自组件的跟踪记录如需了解更多信息,请参阅 记录并直观呈现轨迹页面。