当前位置: 首页 > news >正文

linux之perf(8)annotate标注

Linux之perf(8)annotate标注

Author:Onceday Date:2023年10月12日

漫漫长路,才刚刚开始…

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

参考文档:

  • Tutorial - Perf Wiki (kernel.org)
  • perf-annotate(1) - Linux manual page (man7.org)

文章目录

      • Linux之perf(8)annotate标注
        • 1. 概述
        • 2.选项描述
          • 2.1 选项概览
          • 2.2 解码指令跟踪数据

1. 概述

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等工具文件

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指定指令事件的周期:

perf annotate --itrace=i10000

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

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

perf annotate --itrace=i0nss1000000

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

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

perf annotate --itrace=e+o

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

http://www.lryc.cn/news/199369.html

相关文章:

  • 【广州华锐互动】VR建筑安全培训体验为建筑行业人才培养提供有力支持
  • 【Javascript保姆级教程】运算符
  • 图论与网络优化
  • 【论文复现】基于多模态深度学习方法的单细胞多组学数据聚类(【生物信息学】实验二:多组学数据融合:scMDC)
  • mysql按指定字符截取
  • 搜索引擎-在URL地址栏输入信息,不跳转
  • 10种新型网络安全威胁和攻击手法
  • Elasticsearch:painless script 语法基础和实战
  • 《数据结构、算法与应用C++语言描述》使用C++语言实现数组双端队列
  • TikTok Shop新结算政策:卖家选择权加强,电商市场蓄势待发
  • asp.net特色商品购物网站系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • 解决一则诡异的javascript函数不执行的问题
  • 汽车安全的未来:毫米波雷达在碰撞避免系统中的角色
  • 体感互动游戏研发虚拟场景3D漫游
  • 微信小程序获取手机号(2023年10月 python版)[无需订阅]
  • Linux下设置网关以及网络相关命令
  • linux三剑客~sed命令的使用
  • virtualBox虚拟机安装多个+主机访问虚拟机+虚拟机访问外网配置
  • 正点原子嵌入式linux驱动开发——Linux按键输入
  • java--强制类型转换
  • java后端调用接口Basic auth认证
  • App爬虫之强大的Airtest的操作总结
  • MODBUS-TCP转MODBUS-RTU通信应用(S7-1200和串口服务器通信)
  • 开源贡献难吗?
  • seata的TCC模式分析
  • 常用linux命令【主要用于日志查询,目录切换】
  • Python学习基础笔记七十六——Python装饰器2
  • 生产环境解决用户登录问题的实践
  • 通讯协议学习之路:QSPI协议理论
  • pip安装修改镜像源