https://harmonyos.51cto.com
一、Bytrace简介
bytrace是开发人员用于追踪进程轨迹、查看性能的一种工具,主要对内核ftrace进行了封装和扩展,来支持用户态的打点。该工具主要分为两部分,API和命令行:
1.bytrace向应用开发人员暴露了打点的API,开发应用过程中可以在关键代码处调用对应API进行打点;
2.命令行部分通过使能对应的label,来获取打点信息。通过该工具可以打开想要查看的用户态和内核label(通过命令行“bytrace -l”,查看支持的所有label),然后通过命令行进行抓取trace信息到指定文件中,下文有具体使用指导。
二、架构图
三、Bytrace工具使用说明
命令行列表
Option Description
-h,--help 查看option帮助
-b n,--buffer_size n 指定n(KB)内存大小用于存取trace日志,默认2048KB
-t n,--time n 用来指定trace运行的时间(单位:s),取决于需要分析过程的时间
--trace_clock clock trace输出的时钟类型,一般设备支持boot、global、mono、uptime、perf等,默认为boot
--trace_begin 启动抓trace
--trace_dump 将数据输出到指定位置(默认控制台)
--trace_finish 停止抓trace,并将数据输出到指定位置(默认控制台)
-l,--list_categories 输出手机能支持的trace模块
--overwrite 当缓冲区满的时候,将丢弃最新的信息。(默认丢弃最老的日志)
-o filename,--output filename 指定输出的目标文件名称
-z 抓取trace后进行压缩
四、工具使用示例
@echo off
hdc shell "echo > /sys/kernel/debug/tracing/trace"
hdc shell "echo 4096 > /sys/kernel/debug/tracing/saved_cmdlines_size"
hdc shell "bytrace -t 10 -b 4096 --overwrite ohos zimage zmedia zcamera zaudio ability distributeddatamgr graphic freq irq mdfs workq mmc idle notification sync pagecache ace app > /data/mynewtrace.ftrace"
hdc shell "echo > /sys/kernel/debug/tracing/trace"
hdc shell "sed -i '1,2d' /data/mynewtrace.ftrace"
hdc file recv /data/mynewtrace.ftrace %cd%
pause
hdc为hdc.exe文件,hdc能连接上,执行上述命令,完成在当前目录获取到mynewtrace.ftrace文件
echo > /sys/kernel/debug/tracing/trace 清空系统trace数据,便于抓取产生的新数据
echo 4096 > /sys/kernel/debug/tracing/saved_cmdlines_size
保存trace数据数目,4096条
-t 10 -b 4096 为抓取10s的数据,指定4096(KB)内存大小用于存取trace日志
ohos zimage zmedia zcamera zaudio ability distributeddatamgr graphic freq
irq mdfs workq mmc idle notification sync pagecache ace app 为抓取数据的模块
sed -i '1,2d' /data/mynewtrace.ftrace 删除前面两行不需要数据内容
hdc file recv /data/mynewtrace.ftrace %cd% hdc下载ftrace文件内容到本地当前目录
五、ftrace数据的调度轨迹数据
entries-in-buffer/entries-written: 42335/42335 #P:2
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID TGID CPU# |||| TIMESTAMP FUNCTION
# | | | | |||| | |
bytrace-542 ( 542) [001] .... 4811.090453: mm_filemap_add_to_page_cache: dev 179:7 ino e1 page=05202a4a pfn=587751 ofs=0
<idle>-0 (-------) [001] d... 4811.090585: cpu_idle: state=1 cpu_id=1
<idle>-0 (-------) [001] d.h. 4811.100006: irq_handler_entry: irq=24 name=arch_timer
<idle>-0 (-------) [000] d.h. 4811.100007: irq_handler_entry: irq=24 name=arch_timer
<idle>-0 (-------) [001] dnh. 4811.100053: softirq_raise: vec=9 [action=RCU]
<idle>-0 (-------) [001] dns. 4811.100097: ipi_raise: target_mask=00000001 (Function call interrupts)
<idle>-0 (-------) [001] .ns. 4811.100101: softirq_exit: vec=9 [action=RCU]
<idle>-0 (-------) [001] .n.. 4811.100104: cpu_idle: state=4294967295 cpu_id=1
softbus_server-272 ( 178) [000] d.h. 4811.100105: irq_handler_entry: irq=19 name=IPI
softbus_server-272 ( 178) [000] d.h. 4811.100109: ipi_entry: (Function call interrupts)
softbus_server-272 ( 178) [000] d.h. 4811.100124: ipi_exit: (Function call interrupts)
softbus_server-272 ( 178) [000] d.h. 4811.100126: irq_handler_exit: irq=19 ret=handled
TASK-PID为任务进程ID, TGID为线程ID, CPU#为CPU核ID, TIMESTAMP为运行的时间戳,FUNCTION为程序运行的函数