如何让Perfetto像日志瞬时打印事件-重学Perfetto的ATRACE相关API

背景:

常见使用perfetto进行看方法调用时候,每个方法执行都是有一个个片段,因为代码中加入atrace时候都有对应begin和end方法成对出现,哪怕ATRACE_CALL这种宏其实也是一个临时对象进行构造时候调用atrace_begin,在析构方法中atrace_end。

在这里插入图片描述
正因为都是有调用atrace的开始和结束方法才可以看到方法片段。

上面是我们的常用打印atrace方法情况,但是大家有没有想过我们打印日志其实是一个瞬时动作,直接调用一下ALOGE方法就可以这个时间点输出日志,完全不需要begin和end成对打印。

        ALOGE(fmt, ##__VA_ARGS__);                  \

那么如何在perfetto中也实现类似日志瞬时打印ALOGE这种输出功能呢?

Perfetto中瞬时输出功能剖析

其实system/core/libcutils/include/cutils/trace.h
本身有这种瞬时输出的相关api,具体就是如下两个方法:

/**
 * Trace an instantaneous context. name is used to identify the context.
 *
 * An "instant" is an event with no defined duration. Visually is displayed like a single marker
 * in the timeline (rather than a span, in the case of begin/end events).
 *
 * By default, instant events are added into a dedicated track that has the same name of the event.
 * Use atrace_instant_for_track to put different instant events into the same timeline track/row.
 */
#define ATRACE_INSTANT(name) atrace_instant(ATRACE_TAG, name)
static inline void atrace_instant(uint64_t tag, const char* name) {
    if (CC_UNLIKELY(atrace_is_tag_enabled(tag))) {
        atrace_instant_body(name);
    }
}

/**
 * Trace an instantaneous context. name is used to identify the context.
 * track_name is the name of the row where the event should be recorded.
 *
 * An "instant" is an event with no defined duration. Visually is displayed like a single marker
 * in the timeline (rather than a span, in the case of begin/end events).
 */
#define ATRACE_INSTANT_FOR_TRACK(trackName, name) \
    atrace_instant_for_track(ATRACE_TAG, trackName, name)
static inline void atrace_instant_for_track(uint64_t tag, const char* track_name,
                                            const char* name) {
    if (CC_UNLIKELY(atrace_is_tag_enabled(tag))) {
        atrace_instant_for_track_body(track_name, name);
    }
}

注释也写的很明确,ATRACE_INSTANT这个宏就是代表一个瞬时的事件,没有持续时间片段概念,类似一个ALOGE打印一样输出某个瞬时时间点打印出。

还有另一个ATRACE_INSTANT_FOR_TRACK这个宏,功能也和ATRACE_INSTANT一样就是代表一个在Perfetto上的瞬时事件,但是这里多了一个trackName参数,这个trackName参数就是代表轨迹名字,怎么理解这个track呢?

其实如果定义专门traceName后,就是Perfetto会有单独一行来展示这些瞬时事件,他的作用最重要就是把多个地方的瞬时事件可以归纳到同一个trace即在Perfetto的同一行进行展示出来,就像log一样一样可以按时间排列进行上下展示一样,具体理解的话,下面会有代码和图片结合就简单多了。

ATRACE_INSTANT的典型调用和Perfetto展示

其实这个瞬时输出功能在aosp15版本的SurfaceFlinger中就有大量使用这种方式进行打印。
frameworks/native/services/surfaceflinger/Layer.cpp

在这里插入图片描述这里调用是SFTRACE_FORMAT_INSTANT,看看这个宏:

frameworks/native/services/surfaceflinger/common/include/common/trace.h

#define SFTRACE_FORMAT_INSTANT(fmt, ...) \
    ::tracing_perfetto::traceFormatInstant(ATRACE_TAG, fmt, ##__VA_ARGS__)

frameworks/native/libs/tracing_perfetto/tracing_perfetto.cpp

void traceFormatInstant(uint64_t category, const char* fmt, ...) {
//省略
    atrace_instant(category, buf);
 //省略

}

可以看到最后就是调用到了atrace_instant。

atrace_instant在Perfetto的展现:
在这里插入图片描述可以看到atrace_instant在Perfetto就是一个朝上的小箭头,这里大家可能和以前async的binder调用要区分一下:

在这里插入图片描述

ATRACE_INSTANT_FOR_TRACK的典型调用和Perfetto展示

ATRACE_INSTANT_FOR_TRACK本质就是和上面的ATRACE_INSTANT属于一个东西,只不过会把瞬时事件放入到固定的track中,这里给大家使用demo来实战展示一下:

frameworks/native/services/surfaceflinger/Layer.cpp
的两个方法都有加入ATRACE_INSTANT_FOR_TRACK调用
在这里插入图片描述在这里插入图片描述
把setBuffer和latchBufferImpl两个方法都在traceName为TrackTestSf-1中进行展示。

Perfetto中效果如下:

在这里插入图片描述
更多framework实战开发干货,请关注下面“千里马学框架”

<think> 我们正在分析一个命令执行错误。用户尝试使用traceconv命令转换一个名为1.pftrace的文件,但出现了错误。 错误信息显示:“Could not open system (errno: 2, No such file or directory)” 命令格式为:traceconv perfetto system 1.pftrace output.html 根据Perfetto的traceconv工具用法,该命令的语法应该是: traceconv [mode] [input_format] [input_file] [output_file] 其中: mode: 可以是 'perfetto' 或 'systrace' 等 input_format: 输入文件的格式,如 'systrace', 'perfetto' 等 在用户输入的命令中,模式为 'perfetto',输入格式为 'system',输入文件为 '1.pftrace',输出文件为 'output.html' 错误信息指出“Could not open system”,这里的“system”实际上是指输入格式?但错误信息看起来像是在尝试打开一个名为“system”的文件。 实际上,在Perfetto的traceconv中,输入格式应该是“systrace”或“perfetto”,而不是“system”。这里可能是用户将输入格式写错了。 正确的输入格式应该是“systrace”或“perfetto”。由于用户要转换的是.pftrace文件(这是Perfetto的跟踪文件格式),所以输入格式应该是“perfetto”。 因此,正确的命令应该是: traceconv perfetto perfetto 1.pftrace output.html 但是,用户写的是: traceconv perfetto system 1.pftrace output.html 错误在于第二个参数应该是输入文件的格式,而用户写成了“system”,这可能是想写“systrace”?但即使如此,我们转换的是perfetto格式的文件,所以应该用“perfetto”。 另外,还有一种可能是,traceconv期望的第二个参数是输入格式,而“system”并不是一个有效的格式。因此,工具试图将“system”解释为一个文件名?这似乎与错误信息不符,因为错误信息说“Could not open system”,它试图打开的是“system”这个文件? 实际上,我们再看一下traceconv的用法:它需要四个参数,分别是模式、输入格式、输入文件、输出文件。所以,工具应该知道第二个参数是输入格式,而不是文件名。 但是,错误信息却提示无法打开“system”,这很奇怪。可能是工具的实现中,对于输入格式的检查可能是在尝试打开输入文件之后?或者工具存在一个误解:当输入格式字符串不是已知的格式时,它可能将其视为一个文件路径? 根据错误信息,问题在于无法打开名为“system”的文件,这暗示了工具可能将第二个参数(即输入格式字符串)错误地当成了输入文件。但这与工具的设计不符。 重新审视:Perfetto的traceconv工具在早期的版本中,命令格式是: traceconv [command] [arguments] 其中,对于转换命令,有两种模式:'convert' 和 'systrace'。但是在新版本中可能已经改变。 然而,根据用户使用的命令(四个参数:perfetto system 1.pftrace output.html),这符合traceconv的四个参数模式。 但是,错误信息却显示它试图打开“system”文件,而不是我们指定的输入文件“1.pftrace”。那么问题可能出在工具的内部实现:它可能将第二个参数(输入格式)误认为是输入文件? 实际上,我们查看Perfetto的源码(main.cc)可以找到相关逻辑。错误信息是从main.cc的第213行输出的,它尝试打开一个文件,而文件名就是第二个参数(即这里的“system”),然后失败。 因此,我们可以推断:在当前的实现中,traceconv命令的参数顺序可能被误解了?或者工具期望的第一个参数是输入文件,但用户提供的是模式? 实际上,Perfetto官方文档(https://perfetto.dev/docs/analysis/traceconv)中描述traceconv的用法为: traceconv [mode] [input file] [output file] 但是,这里只有三个参数。而我们用户用了四个参数。那么可能是用户多使用了一个参数? 查看文档中的示例: traceconv systrace trace.json trace.html 这是三个参数:模式(systrace)、输入文件(trace.json)、输出文件(trace.html) 而用户使用了四个参数:perfetto, system, 1.pftrace, output.html 因此,用户可能多写了一个参数。实际上,用户想要做的是将perfetto格式的1.pftrace转换成html,那么命令应该是: traceconv perfetto 1.pftrace output.html 但是用户写成了四个参数。所以,工具将第二个参数(system)当成了输入文件,而将第三个参数(1.pftrace)当成了输出文件?然后尝试打开“system”文件,但该文件不存在。 所以,错误原因是:用户多写了一个参数(输入格式),而traceconv只需要三个参数(模式、输入文件、输出文件)。 因此,正确的命令应该是: traceconv perfetto 1.pftrace output.html 另外,注意文档中提到,输入文件可以是Perfetto原生格式(.perfetto-trace或.pftrace),也可以是Systrace格式(.ctrace或.html)。在模式为perfetto时,输入文件应该是Perfetto原生格式。 结论:用户命令中多余的参数“system”导致工具将“system”解释为输入文件,而该文件不存在。 因此,我们需要去掉第二个参数,直接使用: traceconv perfetto 1.pftrace output.html 现在,根据要求,在回答的最后提出3-5个相关问题。 </think>根据错误信息分析,您在使用 Perfetto 的 `traceconv` 工具时遇到了文件路径问题。主要原因是: 1. **参数顺序错误**:`traceconv` 的命令结构应为: `traceconv [模式] [输入文件] [输出文件]` 您的命令 `traceconv perfetto system 1.pftrace output.html` 包含多余的参数 `system`,导致工具将 `system` 误识别为输入文件。 2. **文件未找到**: 工具尝试打开不存在的文件 `system`(错误号 `errno 2`),因为当前目录下没有该文件。 ### 正确命令格式 ```bash traceconv perfetto 1.pftrace output.html ``` ### 关键说明 - **模式选择**: - `perfetto`:原生 Perfetto 格式(`.pftrace`/`.perfetto-trace`) - `systrace`:Systrace 格式(`.html`/`.ctrace`) - **文件路径**: 需确保 `1.pftrace` 文件存在于当前目录 `D:\trace\` 中,或使用绝对路径(如 `D:\trace\1.pftrace`) ### 验证步骤 1. 检查文件是否存在: ```bash dir D:\trace\1.pftrace ``` 2. 尝试简化命令: ```bash traceconv perfetto D:\trace\1.pftrace D:\trace\output.html ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值