simpleperf record -e cs_etm --app com.asobimo.toramonline -a
simpleperf record --app com.asobimo.toramonline -g
simpleperf report -g --gui
python report_html.py -i record/perf.data -o record/report.html
report.py -i record/perf.data -g
sh
用法: simpleperf [常用选项] 子命令 [子命令参数]
常用选项:
-h/--help 打印此帮助信息。
--log <severity> 设置日志的最小严重性。可能的严重性包括 verbose、debug、warning、info、error、fatal。
默认是 info。
--log-to-android-buffer 将日志写入 Android 日志缓冲区而不是标准错误。
--version 打印 simpleperf 的版本信息。
子命令:
api-collect 收集由应用 API 生成的记录数据。
api-prepare 通过应用 API 准备记录。
debug-unwind 调试/测试离线展开。
dump 转储 perf 记录文件。
help 打印 simpleperf 的帮助信息。
inject 解析 ETM 指令跟踪数据。
kmem 收集内核内存分配信息。
list 列出可用的事件类型。
merge 合并多个 perf.data 文件为一个。
monitor 监视事件并将其文本表示打印到标准输出。
record 在 perf.data 中记录采样信息。
report 报告 perf.data 中的采样信息。
report-sample 报告 perf.data 中的原始采样信息。
stat 收集性能计数器信息。
trace-sched 跟踪系统范围内的进程运行时事件。
用法: simpleperf record [选项] [--] [命令 [命令参数]]
收集运行中 [命令] 的采样信息。可以使用 -a/-p/-t 选项来更改采样信息的目标。
默认选项为: -e cpu-cycles -f 4000 -o perf.data。
选择监控线程:
-a 系统范围内的收集。使用 --exclude-perf 排除 simpleperf 进程的样本。
--app package_name 配置 Android 应用程序进程。
在非 root 设备上,应用必须是可调试的,因为我们使用 run-as 切换到应用的上下文。
-p pid1,pid2,... 记录现有进程的事件。与 -a 互斥。
-t tid1,tid2,... 记录现有线程的事件。与 -a 互斥。
选择监控事件类型:
-e event1[:modifier1],event2[:modifier2],...
选择要记录的一系列事件。事件可以是:
1) 在 `simpleperf list` 中列出的事件名称;
2) 以 rN 格式的原始 PMU 事件。N 是十六进制数。
例如,r1b 选择事件编号 0x1b。
3) 通过 --kprobe 选项添加的 kprobe 事件。
可以添加修饰符来定义如何监控事件。可能的修饰符是:
u - 仅监控用户空间事件
k - 仅监控内核空间事件
--group event1[:modifier],event2[:modifier2],...
类似于 -e 选项。但在同一 --group 选项中指定的事件作为一组监控,并同时调度进出。
--trace-offcpu 当线程从 CPU 上调度时生成样本。
类似于 "-c 1 -e sched:sched_switch"。
--kprobe kprobe_event1,kprobe_event2,...
在记录期间添加 kprobe 事件。kprobe_event 的格式在内核的 Documentation/trace/kprobetrace.rst 中。示例:
'p:myprobe do_sys_open $arg2:string' - 添加事件 kprobes:myprobe
'r:myretprobe do_sys_open $retval:s64' - 添加事件 kprobes:myretprobe
选择监控选项:
-f freq 设置事件采样频率。表示每秒最多记录 [freq] 个样本。对于非跟踪点事件,默认选项是 -f 4000。
-c count 设置事件采样周期。表示每 [count] 个事件发生时记录一个样本。对于跟踪点事件,默认选项是 -c 1。
--call-graph fp | dwarf[,<dump_stack_size>]
启用调用图记录。使用帧指针或 dwarf 调试帧作为解析堆栈中调用图的方法。
默认是 dwarf,65528。
-g 与 '--call-graph dwarf' 相同。
--clockid clock_id 使用所选时钟生成样本的时间戳。可能的值是: realtime, monotonic, monotonic_raw, boottime, perf。如果支持,默认是 monotonic,否则是 perf。
--cpu cpu_item1,cpu_item2,...
仅在选定的 CPU 上收集样本。cpu_item 可以是 CPU 编号如 1,或 CPU 范围如 0-3。
--duration time_in_sec 监控 time_in_sec 秒而不是运行 [命令]。这里 time_in_sec 可以是任何正浮点数。
-j branch_filter1,branch_filter2,...
启用已采取的分支堆栈采样。每个样本捕获一系列连续的已采取分支。
定义的过滤器如下:
any: 任何类型的分支
any_call: 任何函数调用或系统调用
any_ret: 任何函数返回或系统调用返回
ind_call: 任何间接分支
u: 仅当分支目标在用户级别时
k: 仅当分支目标在内核中时
此选项至少需要一个分支类型 among any, any_call, any_ret, ind_call。
-b 启用已采取的分支堆栈采样。与 '-j any' 相同。
-m mmap_pages 设置用于接收来自内核的样本数据的缓冲区大小。它应为 2 的幂。如果未设置,将使用最大可能值 <= 1024。
--aux-buffer-size <buffer_size> 设置 aux 缓冲区大小,仅用于 cs-etm 事件类型。需要为 2 的幂并与页面大小对齐。使用的内存大小是 (buffer_size * (cpu_count + 1)。默认是 4M。
--no-inherit 不记录创建的子线程/进程。
--cpu-percent <percent> 设置记录使用的 CPU 时间的最大百分比。百分比范围为 [1-100],默认是 25。
--addr-filter filter_str1,filter_str2,...
提供 cs-etm 指令跟踪的地址过滤器。filter_str 接受以下格式:
'filter <addr-range>' -- 在范围内跟踪指令
'start <addr>' -- 当 IP 是 <addr> 时开始跟踪
'stop <addr>' -- 当 IP 是 <addr> 时停止跟踪
<addr-range> 接受以下格式:
<file_path> -- 二进制文件中的代码段
<vaddr_start>-<vaddr_end>@<file_path> -- 二进制文件的一部分
<kernel_addr_start>-<kernel_addr_end> -- 内核空间的一部分
<addr> 接受以下格式:
<vaddr>@<file_path> -- 二进制文件中的虚拟地址
<kernel_addr> -- 内核地址
示例:
'filter 0x456-0x480@/system/lib/libc.so'
'start 0x456@/system/lib/libc.so,stop 0x480@/system/lib/libc.so'
--tp-filter filter_string 为前一个跟踪点事件设置 filter_string。格式在内核的 Documentation/trace/events.rst 中。示例: 'prev_comm != "simpleperf" && (prev_pid > 1)'。
Dwarf 展开选项:
--post-unwind=(yes|no) 如果使用 `--call-graph dwarf` 选项,则用户的堆栈将记录在 perf.data 中,并在记录时展开。使用 --post-unwind=yes 切换到记录后展开。
--no-unwind 如果使用 `--call-graph dwarf` 选项,则用户的堆栈将默认展开。使用此选项禁用用户堆栈的展开。
--no-callchain-joiner 如果使用 `--call-graph dwarf` 选项,则默认使用调用链连接器来打破 64k 堆栈限制并构建更完整的调用图。然而,构建的调用图在所有情况下可能并不正确。
--callchain-joiner-min-matching-nodes count
当使用调用链连接器时,设置连接调用链所需的匹配节点。计数应 >= 1。默认是 1。
--no-cut-samples Simpleperf 使用记录缓冲区缓存从内核接收的记录。当缓冲区中可用空间达到低水平时,它会剪切样本中的部分堆栈数据。当可用空间达到关键水平时,它会丢弃所有样本。此选项使 simpleperf 在可用空间达到低水平时不剪切样本。
--keep-failed-unwinding-result 保留展开失败的原因。
--keep-failed-unwinding-debug-info 保留展开失败的调试信息。
样本过滤选项:
--exclude-perf 排除 simpleperf 进程的样本。
--exclude-pid pid1,pid2,... 排除选定进程的样本。
--exclude-tid tid1,tid2,... 排除选定线程的样本。
--exclude-process-name process_name_regex 排除名称包含正则表达式的进程的样本。
--exclude-thread-name thread_name_regex 排除名称包含正则表达式的线程的样本。
--exclude-uid uid1,uid2,... 排除属于选定 uid 的进程的样本。
--include-pid pid1,pid2,... 包含选定进程的样本。
--include-tid tid1,tid2,... 包含选定线程的样本。
--include-process-name process_name_regex 包含名称包含正则表达式的进程的样本。
--include-thread-name thread_name_regex 包含名称包含正则表达式的线程的样本。
--include-uid uid1,uid2,... 包含属于选定 uid 的进程的样本。
记录文件选项:
--no-dump-kernel-symbols 不在 perf.data 中转储内核符号。默认情况下,内核符号将在需要时转储。
--no-dump-symbols 不在 perf.data 中转储符号。默认情况下,符号会转储到 perf.data 中,以支持在其他环境中报告。
-o record_file_name 设置记录文件名,默认是 perf.data。
--size-limit SIZE[K|M|G] 记录达到 SIZE 字节的记录后停止。默认是无限制。
--symfs <dir> 查找相对于此目录的符号文件。此选项用于提供带有符号表和调试信息的文件,这些文件用于展开和转储符号。
--add-meta-info key=value 添加额外的元信息,将存储在记录文件中。
其他选项:
--exit-with-parent 当启动 simpleperf 的进程终止时停止记录。
--start_profiling_fd fd_no 开始分析后,写入 "STARTED" 到 <fd_no>,然后关闭 <fd_no>。
--stdio-controls-profiling 使用 stdin/stdout 暂停/恢复分析。
--in-app 我们已经在应用的上下文中运行。
--tracepoint-events file_name 从 [file_name] 而不是 tracefs 中读取跟踪点事件。