oprofile交叉编译、移植使用
作者:互联网
oprofile 简介
oprofile 检测哪个程序,以及哪个函数消耗的CPU时间较多,CPU负荷,性能比较关注的时候可以使用此工具检测以及对程序以及相应程序进行优化。
其原理是: CPU都提供一个所谓性能计数器的东西(performance counter),大致的原理就是程序可以注册告诉CPU对什么event感兴趣(比如CPU_CYCLE,CPU经历了一次时钟周期),然后CPU在执 行了相应的操作后,就会在性能计数器上加1,这样程序就可以取出。所以,使用OProfile来定位CPU使用率的问题,就变成了让oprofile收集 程序运行过程中哪个可执行程序(或是so)中的哪个function,消耗的CPU CYCLE最多。这种测试方法结果更符合实际情况。
1.oprofile 编译前下载依赖库
oprofile 工具交叉编译前需要的依赖库有popt、binutils库、oprofile工具。我使用的库popt库版本1.18,下载地址: [(https://ftp.osuosl.org/pub/blfs/conglomeration/popt/popt-1.18.tar.gz)] binutils库版本2.33.1 下载地址:[https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.gz] ,oprofile我在此下载版本是oprofiel-1.1.10.tar.gz,下载地址:[https://oprofile.sourceforge.io/about/]。下载此三个文件后首先进行popt库、binutils依赖库的交叉编译。
2 popt 库的交叉编译
将下载的popt库按照如下命令操作进行交叉编译,在编译前首先将交叉编译工具配置于环境变量中,我使用的交叉编译链工具是arm-linux-gnueabihf-gcc ,arm-linux-gnueabihf-g++. 在linux下的操作命令:
export PATH=$PATH:/home/arm-linux/bin #此文件为交叉编译链工具存放的哦目录
tar -zxvf popt-1.18.tar.gz
cd popt-1.18.0
./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --enable-host-shared AR=arm-linux-gnueabihf-ar --prefix=/home/popt # 设置安装popt库的目录 此步生成Makefile 文件
make #等待编译完成
make install #此步完成后在/home/popt 生成了bin include share 等文件即popt库交叉编译完成
3 binultils 库的交叉编译
将下载的binutils2.33.1库,进行解压编译。我们在编译oprofile工具的时候还需要libiberty库依赖,但是在我们binultis库中的libiberty需要单独编译,再编译完binultis后,需要进入binutils目录下再进入libiberty 然后进行配置重新生成编译libiberty库的Makefile文件。如下操作命令:
tar -zxvf binultis-2.33.1.tar.gz
cd binutils-2.33.1
./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar --enable-shared=yes --enable-libiberty --prefix=/home/bitnuts # 生成Makefile
make & make install # 编译生成相应的bin include lib shared 文件
# 生成libiberty库命令
cd binutils/libiberty
./configure --enable-install-libiberty --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --enable-shared=yes --prefix=/home/bitnutils
make & make install #此步操作完成即完成了所有的binutils的库的操作
4 编译oprofile-1.1.0工具
在编译oprofile工具的时候我们需要依赖编译生成的popt库,binutils库。操作命令如下
# 首先通过.configure 文件生成Makefile文件 --with-binutils=/home/binutils binutils库的路径,--with-kernel=/home/kernel/linux-4.4.32内核源码的路径
./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ AR=arm-linux-gnueabihf-ar CPPFLAGS="-I/home/zhoushanlin/popt/include" LDFLAGS="-L/home/zhoushanlin/popt/lib" --with-binutils=/home/binutils --with-kernel=/home/kernel/linux-4.4.32 --prefix=/home/oprofile
make & make install # 在oprofile 文件下生成bin 、include lib shared
通过上面的命令将生成的bin,include lib shared 文件移植在开发板即可。
5 oprofile 使用
我将oprofile 移植在了/opt/oprofile目录下。在/opt/oprofile/bin下我们使用operf 和opreport即可 。
我们使用如下操作即可通过日志观察我们程序中一段时间采样到的函数使用CPU的占比,opreport获取采样信息。
export PATH=$PATH:/opt/oprofile/bin/ # 配置临时环境变量
./operf -p PID # 检测固定PID进程
ctrl+c # 进行采样一段时间后我们手动结束掉
./opreport --exclude-dependent 查看占比cpu的信息
./opreport --exclude-dependent --demangle=smart --symbols `which PID_name`# 查看具体日志内容 opreport将本地存放的日志进行分析
如下图所示,是我们通过operf抓到的分析日志。
总结
在折腾了两天后oprofile 可以正常使用了,主要通过operf 以及opreport 配合使用,分析应用程序中函数的使用占比CPU有助于我们分析程序进行优化,减少CPU不必要的负荷。能准确的帮我们分析应用程序定位程序。
标签:--,linux,编译,binutils,popt,oprofile,移植 来源: https://blog.csdn.net/qq_25145647/article/details/115772380