Skip to content

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 中读取跟踪点事件。