explorer

万丈高楼平地起,勿在浮沙筑高台

0%

[What]perf 基本使用

perf 是Linux(2.6+)内置的强大的分析工具,所以其既可以用于PC也可以用于嵌入式Linux。

目标机安装

但在编译过程中发现交叉编译器有很多的库提示没有安装,下面进行一一安装( 如果忽略这些警告,就会出现perf输出文件中很多符号都是 [unknown] 的情况,即使应用编译时使用了 -g 选项):

  • 其中最为重要的就是 elf,binutils,unwind
  • 编译器使用的库路径一般在其安装在其目录下的 /libc/usr/
  • 而目标机文件系统路径一般安装在 /usr 目录下

安装zlib(elfutils依赖)

sourceforge下载源码。

  • 安装到编译器路径
tar -xzf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
CC=arm-linux-gnueabihf-gcc ./configure --prefix=/opt/Xilinx/SDK/2016.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr
make
make install
  • 安装到目标机根文件系统 (可使用busybox中的库代替这种方式,以减小image大小)
CC=arm-linux-gnueabihf-gcc ./configure --prefix=/usr
make
make install DESTDIR=/home/cec/zlib

最后将此文件夹内容拷入根文件系统 /usr 即可。

安装libc6(elfutils依赖)

Debian找到交叉编译版本的libc6。

  • 安装到编译器路径
mkdir libc6
dpkg-deb -x libc6-armel-cross_2.24-10cross1_all.deb libc6
cd libc6
cp -R usr/arm-linux-gnueabi/lib/** /opt/Xilinx/SDK/2016.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr/lib/
  • 安装到目标机根文件系统 (可使用busybox中的库代替这种方式,以减小image大小)

最后将此文件夹内容拷入根文件系统 /usr 即可。

安装elfutils

根据编译提示,在下载站下载与之更新的版本。

  • 安装到编译器路径
#下载及解压
axel -n 20 https://sourceware.org/elfutils/ftp/0.172/elfutils-0.172.tar.bz2
tar -xjf elfutils-0.172.tar.bz2
cd elfutils-0.172/
#查看其INSTALL文件得出其配置命令
CC=arm-linux-gnueabihf-gcc ./configure --host=arm --prefix=/opt/Xilinx/SDK/2016.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr
make
make install
  • 安装到目标机根文件系统 (可使用busybox中的库代替这种方式,以减小image大小)
CC=arm-linux-gnueabihf-gcc ./configure --host=arm --prefix=/usr
make
make install DESTDIR=/home/cec/elflib

最后将此文件夹内容拷入根文件系统 /usr 即可。

安装liblzma(libunwind 依赖)

官网下载源码。

  • 安装到编译器路径
CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux-gnueabihf --prefix=/opt/Xilinx/SDK/2016.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr --enable-shared=yes
make
make install

安装libunwind

bug修复

目前libunwind还有一个bug造成函数 arm_search_unwind_table 重复定义,解决方案在此patch

编译及安装

  • 安装到编译器路径
git clone git://git.sv.gnu.org/libunwind.git
cd libunwind/
#查看README
./autogen.sh 
CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux-gnueabihf --prefix=/opt/Xilinx/SDK/2016.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr --enable-shared=yes
make
make install

说明: 此步出现错误 undefined reference to `_Uarm_is_signal_frame' 还未解决。

  • 安装到目标机根文件系统

安装libaudit(失败,但不影响使用,可忽略)

  • 安装到编译器路径
git clone https://github.com/linux-audit/audit-userspace
cd audit-userspace/
  • 安装到目标机根文件系统

安装libiberty(binutils依赖)

libiberty 是gcc项目中自带的库,其安装说明位于官网需要根据当前的编译器版本拷贝对应版本的代码进行编译!!!

  • 安装到编译器路径
CC=arm-linux-gnueabihf-gcc ./configure --host=arm --target=arm --prefix=/opt/Xilinx/SDK/2016.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr --enable-install-libiberty
make
make install

安装binutils

  • 安装到编译器路径

官网下载源码。

tar -xjf binutils-2.25.tar.bz2
cd binutils-2.25/
mkdir build
cd build/
CC=arm-linux-gnueabihf-gcc ../configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=/opt/Xilinx/SDK/2016.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr --enable-shared=yes
make
make install
  • 安装到目标机根文件系统 (可使用busybox中的库代替这种方式,以减小image大小)
CC=arm-linux-gnueabihf-gcc ../configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=/usr --enable-shared=yes
make install DESTDIR=/home/cec/binutils

最后将此文件夹内容拷入根文件系统 /usr 即可。

安装perf

perf 是在 tools/perf 文件中的一个独立应用软件,所以需要先编译它以可以用在目标机上。

在此目录下查看文件 Makefile.perf 发现有如下几行:

Define ARCH as name of target architecture if you want cross-builds.
Define CROSS_COMPILE as prefix name of compiler if you want cross-builds.

可以通过这两个选项来指定编译器和编译架构:

#也可以使用静态编译的方式,这样前面的库也就不用加入根文件系统了,
#需要在下面命令的基础上加上选项 "LDFLAGS=-static" ,更多选项需参考Makefile.perf
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
  • 安装到目标机根文件系统

将编译出的可执行文件拷贝进目标机 /usr/bin/ 即可。

全局概览

在shell中输入 perf 便可列出其可执行的所有命令:

cec@box:~/github/lepd$ perf

 usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]

 The most commonly used perf commands are:
 annotate        Read perf.data (created by perf record) and display annotated code
 archive         Create archive with object files with build-ids found in perf.data file
 bench           General framework for benchmark suites
 buildid-cache   Manage build-id cache.
 buildid-list    List the buildids in a perf.data file
 c2c             Shared Data C2C/HITM Analyzer.
 config          Get and set variables in a configuration file.
 data            Data file related processing
 diff            Read perf.data files and display the differential profile
 evlist          List the event names in a perf.data file
 ftrace          simple wrapper for kernel's ftrace functionality
 inject          Filter to augment the events stream with additional information
 kallsyms        Searches running kernel for symbols
 kmem            Tool to trace/measure kernel memory properties
 kvm             Tool to trace/measure kvm guest os
 list            List all symbolic event types
 lock            Analyze lock events
 mem             Profile memory accesses
 record          Run a command and record its profile into perf.data
 report          Read perf.data (created by perf record) and display the profile
 sched           Tool to trace/measure scheduler properties (latencies)
 script          Read perf.data (created by perf record) and display trace output
 stat            Run a command and gather performance counter statistics
 test            Runs sanity tests.
 timechart       Tool to visualize total system behavior during a workload
 top             System profiling tool.
 probe           Define new dynamic tracepoints
 trace           strace inspired tool

 #使用这种方式会进入一个命令的手册进行详细解说,
 #也可以使用 perf COMMAND -h 来简略列出命令说明
 See 'perf help COMMAND' for more information on a specific command.

命令简略说明

perf list (系统事件捕捉列表)

系统事件分为:

  • 软件事件(Software Event):偏向系统及用户运行软件的事件,与具体的CPU类型无关
  • 硬件事件(Performance Monitoring Unit,PMU): 与CPU相关的事件,需要参考CPU相关手册
  • 捕捉点事件(Tracepoint event): 内核中的 tracepoint 事件相关

使用

  • 根据自身需求确定需要捕捉哪种事件
  • 输入 perf list 根据其列出的事件名列表以及说明确定需要使用的事件名
  • 使用 sudo perf top -e <event name1>[,<event name2>] 来确定捕捉哪些事件
Last Updated 2021-01-26 二 12:12.
Render by hexo-renderer-org with Emacs 26.3 (Org mode 9.4)