linux之perf(8)annotate标注

Linux之perf(8)annotate标注

Author:Onceday Date:2023年10月12日

漫漫长路,才刚刚开始...

注:该文档内容采用了GPT4.0生成的回答,部分文本准确率可能存在问题

参考文档:

文章目录

1. 概述

perf-annotate命令用于读取perf.data文件(由perf record命令创建)并显示注释后的代码。

该命令读取输入文件并显示注释后的代码版本。如果目标文件具有调试符号,则源代码将与汇编代码一起显示。

如果对象中没有调试信息,则会显示注释后的汇编。

假设你已经使用perf record命令创建了一个perf.data文件,你可以使用perf annotate命令来查看注释的代码:

yacas 复制代码
perf annotate -i perf.data

在这个例子中,perf annotate将从perf.data文件中读取数据,然后显示注释后的代码。

如果你想查看特定符号的注释代码,你可以在命令后面添加符号名。

yacas 复制代码
perf annotate -i perf.data symbol_name

在这个例子中,perf annotate将只显示与symbol_name符号相关的注释代码。

标注汇编指令和源码等功能需要可执行文件携带符号,以及当前环境下存在可执行的obidump/addr2line等工具文件

2.选项描述
2.1 选项概览
选项 描述
-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)。注意,这是关于要显示的函数的选择,而不是函数内的行
2.2 解码指令跟踪数据

--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:近似IPC
  • Z:首选忽略时间戳(所谓的"无时间"解码)

默认情况下,所有事件都是默认的,即与--itrace=iybxwpe相同,但对于perf script,默认为--itrace=ce

可以指定指令事件的周期(默认为100000,对于perf script默认为1),可以使用以下单位:

  • i:指令
  • t:ticks
  • ms:毫秒
  • 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指定指令事件的周期:

bash 复制代码
perf annotate --itrace=i10000

这个命令将设置指令事件的周期为10000。

如果你想跳过初始化代码,你可以使用如下命令:

bash 复制代码
perf annotate --itrace=i0nss1000000

这个命令将跳过开始的一百万条指令。

使用perf annotate来合成错误事件,并只报告溢出错误:

bash 复制代码
perf annotate --itrace=e+o

在这个例子中,perf annotate将合成错误事件,并只报告溢出错误。

相关推荐
Flying_Fish_roe12 分钟前
linux-安全管理-防火墙与网络安全
linux·数据库·oracle
不见长安见晨雾23 分钟前
Linux:vim编辑技巧
linux·编辑器·vim
神秘的土鸡1 小时前
Linux中使用Docker容器构建Tomcat容器完整教程
linux·运维·服务器·docker·容器·tomcat
TravisBytes1 小时前
linux 系统是如何收发数据包
linux·运维·服务器
ice___Cpu3 小时前
Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
linux·运维·前端
z202305083 小时前
linux 之0号进程、1号进程、2号进程
linux·运维·服务器
狐心kitsune4 小时前
erlang学习:Linux常用命令1
linux·学习·erlang
DREAM依旧4 小时前
《深入了解 Linux 操作系统》
linux
阿赭ochre5 小时前
Linux环境变量&&进程地址空间
linux·服务器
Iceberg_wWzZ5 小时前
数据结构(Day14)
linux·c语言·数据结构·算法