Author:Onceday Date:2023年10月12日
漫漫长路,才刚刚开始…
注:该文档内容采用了GPT4.0生成的回答,部分文本准确率可能存在问题。
参考文档:
perf-annotate
命令用于读取perf.data
文件(由perf record
命令创建)并显示注释后的代码。
该命令读取输入文件并显示注释后的代码版本。如果目标文件具有调试符号,则源代码将与汇编代码一起显示。
如果对象中没有调试信息,则会显示注释后的汇编。
假设你已经使用perf record
命令创建了一个perf.data
文件,你可以使用perf annotate
命令来查看注释的代码:
perf annotate -i perf.data
在这个例子中,perf annotate
将从perf.data
文件中读取数据,然后显示注释后的代码。
如果你想查看特定符号的注释代码,你可以在命令后面添加符号名。
perf annotate -i perf.data symbol_name
在这个例子中,perf annotate
将只显示与symbol_name
符号相关的注释代码。
标注汇编指令和源码等功能需要可执行文件携带符号,以及当前环境下存在可执行的obidump/addr2line等工具文件。
选项 | 描述 |
---|---|
-i, --input=[file] | 输入文件名。(默认为:perf.data,除非标准输入是一个管道) |
-d, --dsos=[dso[,dso…]] | 只考虑这些动态共享对象(DSOs)中的符号 |
-s, --symbol=[symbol] | 要注释的符号 |
-f, --force | 不进行所有权验证 |
-v, --verbose | 更详细地显示信息(示例如符号地址等) |
-q, --quiet | 不显示任何警告或消息(抑制-v) |
-n, --show-nr-samples | 显示每个符号的样本数量 |
-D, --dump-raw-trace | 以ASCII格式转储原始跟踪 |
-k, --vmlinux=[file] | vmlinux文件的路径 |
–ignore-vmlinux | 忽略vmlinux文件 |
–itrace | 用于解码指令跟踪数据的选项 |
-m, --modules | 加载模块符号。警告:仅与-k和LIVE内核一起使用 |
-l, --print-line | 打印匹配的源代码行(可能比较慢) |
-P, --full-paths | 不缩短显示的路径名 |
–stdio | 使用stdio接口 |
–stdio2 | 使用非交互的stdio2接口,使用TUI格式 |
–stdio-color=[mode] | 始终,从不或自动,允许通过命令行配置颜色输出,除了通过"color.ui" .perfconfig。使用–stdio-color always即使在重定向到管道或文件时也生成颜色。仅使用–stdio-color等同于使用always. |
–tui | 使用TUI接口。使用–tui需要tty,如果没有,如当管道到其他命令时,将使用stdio接口。此接口从居中的行开始,TAB/UNTAB在更多样本的行中循环。 |
–gtk | 使用GTK接口 |
-C, --cpu=[cpu] | 只报告提供的CPU列表的样本。可以提供多个CPU,作为没有空格的逗号分隔列表:0,1。CPU范围用-指定:0-2。默认报告所有CPU上的样本 |
–asm-raw | 显示汇编指令的原始指令编码 |
–show-total-period | 显示总周期数的列 |
–source | 将源代码与汇编代码交错。默认启用,使用–no-source禁用 |
–symfs=[directory] | 查找相对于此目录的带有符号的文件 |
-M, --disassembler-style= | 为objdump设置反汇编样式 |
–addr2line=[path] | addr2line二进制文件的路径 |
–objdump=[path] | objdump二进制文件的路径 |
–prefix=PREFIX, --prefix-strip=N | 从可执行文件中的源文件路径名中删除前N个条目并添加PREFIX。这允许显示在具有不同文件系统布局的系统上编译的源代码 |
–skip-missing | 跳过无法注释的符号 |
–group | 一起显示事件组信息 |
–demangle | 将符号名称解析为人类可读形式。默认启用,使用–no-demangle禁用 |
–demangle-kernel | 将内核符号名称解析为人类可读形式(用于C++内核) |
–percent-type | 从以下选择中设置注释百分比类型:global-period, local-period, global-hits, local-hits.local/global关键字设置百分比是否在函数范围(本地)或整个数据(全局)中计算。period/hits关键字设置百分比计算的基础 - 样本期间或样本数量(命中)。 |
–percent-limit | 在stdio或stdio2上不显示功能,这些功能的开销在该百分比以下(默认:0)。注意,这是关于要显示的函数的选择,而不是函数内的行 |
--itrace
:用于解码指令跟踪数据的选项,包括:
i
:合成指令事件y
:合成周期事件b
:合成分支事件(对于Arm SPE,为分支未命中)c
:合成分支事件(仅调用)r
:合成分支事件(仅返回)x
:合成事务事件w
:合成ptwrite事件p
:合成功耗事件(包括Intel PT的PSB事件)o
:合成由于使用aux-output而记录的其他事件(参见perf record)I
:合成中断或类似的(异步)事件(例如,Intel PT事件跟踪)e
:合成错误事件d
:创建调试日志f
:合成一级缓存事件m
:合成最后一级缓存事件M
:合成内存事件t
:合成TLB事件a
:合成远程访问事件g
:合成调用链(与i或x一起使用)G
:在现有事件记录上合成调用链l
:合成最后一次分支条目(与i或x一起使用)L
:在现有事件记录上合成最后一次分支条目s
:跳过初始数量的事件q
:更快(较少详细)的解码A
:近似IPCZ
:首选忽略时间戳(所谓的“无时间”解码)默认情况下,所有事件都是默认的,即与--itrace=iybxwpe
相同,但对于perf script
,默认为--itrace=ce
。
可以指定指令事件的周期(默认为100000,对于perf script
默认为1),可以使用以下单位:
i
:指令t
:ticksms
:毫秒us
:微秒ns
:纳秒(默认)可以指定指令或事务事件的调用链大小(默认为16,最大为1024)。也可以指定指令或事务事件的最后分支条目数量(默认为64,最大为1024)。
对于选项G和L,也可以指定大小,类似于选项g和l。在x86上,请注意,当数据已经用大PEBS记录时,G和L的工作效果较差。详细信息请参见linkperf:perf-intel-pt[1]手册页。
也可以跳过一开始生成的事件(指令,分支,事务,ptwrite,功耗。这对于忽略初始化代码很有用。--itrace=i0nss1000000
跳过第一百万条指令。
‘e’选项可以跟随影响将或将不会报告什么错误的标志。每个标志必须以’+‘或’-'为前缀。标志包括:
o
:溢出l
:丢失跟踪数据如果支持,‘d’选项可能会跟随影响将或将不会记录什么调试信息的标志。每个标志必须以’+‘或’-'为前缀。标志包括:
a
:所有perf事件e
:仅在错误时输出(大小可配置 - 请参见linkperf:perf-config[1])o
:输出到stdout如果支持,'q’选项可以重复以增加效果。要完全禁用解码,请使用--no-itrace
。
使用perf annotate
指定指令事件的周期:
perf annotate --itrace=i10000
这个命令将设置指令事件的周期为10000。
如果你想跳过初始化代码,你可以使用如下命令:
perf annotate --itrace=i0nss1000000
这个命令将跳过开始的一百万条指令。
使用perf annotate
来合成错误事件,并只报告溢出错误:
perf annotate --itrace=e+o
在这个例子中,perf annotate
将合成错误事件,并只报告溢出错误。