oprofile是linux平台功能强大的性能分析工具,支持两种采样(sampling)方式:基于事件的采样(event based)和基于时间的采样(time based)。

1、需要下载版本:

oprofile-0.9.7.tar.gz: http://oprofile.sourceforge.net/download/

popt-1.14.tar.gz: http://freshmeat.net/projects/popt/

binutils-2.21.1.tar.gz: http://ftp.gnu.org/gnu/binutils/

2、编译方法:

将下面内容放进shell脚本,修改交叉编译器,一键生成。

#!/bin/bash

#将上面3个包解压到同一个目录里,同时建立一下三个目录

mkdir target_dir
mkdir tmp_dir
mkdir bin

#arm-hisiv300-linux交叉编译器
CROSS_COMPILE=arm-hisiv300-linux
TMP_DIR=$PWD/tmp_dir
TARGET_DIR=$PWD/target_dir

#1. compile popt library
cd popt-1.14 
make clean
./configure --with-kernel-support --host=$CROSS_COMPILE --prefix=$TMP_DIR LDFLAGS=-static ac_cv_va_copy=C99
make && make install
cd -

#2. compile binutils
cd binutils-2.21.1
make clean
./configure --with-kernel-support --host=$CROSS_COMPILE --enable-install-libbfd --prefix=$TMP_DIR --disable-nls
make && make install
cd -

#3. compile oprofile
cd oprofile-0.9.8
make clean
./configure --with-kernel-support --host=$CROSS_COMPILE  --with-binutils=$TMP_DIR --prefix=$TARGET_DIR LDFLAGS=-static
make
#use tatically linked
#<make install>

#(1)compile ophelp and op-check-perfevents
cd utils
rm ophelp
$CROSS_COMPILE-gcc -W -Wall -fno-common -Wdeclaration-after-statement -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o ophelp ophelp.o ../libop/libop.a ../libutil/libutil.a -lpopt -liberty -ldl

rm op-check-perfevents
$CROSS_COMPILE-gcc -W -Wall -fno-common -Wdeclaration-after-statement -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o op-check-perfevents op_check_perfevents-op_perf_events_checker.o  -lpopt -liberty -ldl

cd -

#(2)compile opannotate, oparchive, opgprof, opreport
cd pp
rm opannotate
$CROSS_COMPILE-g++ -W -Wall -fno-common -ftemplate-depth-50 -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o opannotate opannotate.o opannotate_options.o common_option.o ../libpp/libpp.a ../libopt++/libopt++.a ../libregex/libop_regex.a ../libutil++/libutil++.a ../libop/libop.a ../libutil/libutil.a ../libdb/libodb.a -lpopt -lbfd -liberty -ldl

rm oparchive
$CROSS_COMPILE-g++ -W -Wall -fno-common -ftemplate-depth-50 -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o oparchive oparchive.o oparchive_options.o common_option.o ../libpp/libpp.a ../libopt++/libopt++.a ../libregex/libop_regex.a ../libutil++/libutil++.a ../libop/libop.a ../libutil/libutil.a ../libdb/libodb.a -lpopt -lbfd -liberty -ldl

rm opgprof
$CROSS_COMPILE-g++ -W -Wall -fno-common -ftemplate-depth-50 -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o opgprof opgprof.o opgprof_options.o common_option.o ../libpp/libpp.a ../libopt++/libopt++.a ../libregex/libop_regex.a ../libutil++/libutil++.a ../libop/libop.a ../libutil/libutil.a ../libdb/libodb.a -lpopt -lbfd -liberty -ldl

rm opreport
$CROSS_COMPILE-g++ -W -Wall -fno-common -ftemplate-depth-50 -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o opreport opreport.o opreport_options.o common_option.o ../libpp/libpp.a ../libopt++/libopt++.a ../libregex/libop_regex.a ../libutil++/libutil++.a ../libop/libop.a ../libutil/libutil.a ../libdb/libodb.a -lpopt -lbfd -liberty -ldl

cd -

#(3)compile opjitconv
cd opjitconv
rm opjitconv
$CROSS_COMPILE-gcc -W -Wall -fno-common -Wdeclaration-after-statement -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o opjitconv opjitconv.o conversion.o parse_dump.o jitsymbol.o create_bfd.o debug_line.o ../libutil/libutil.a -lbfd -liberty -ldl

cd -

#(4)compile opimport
cd libabi
rm opimport
$CROSS_COMPILE-g++ -W -Wall -fno-common -ftemplate-depth-50 -g -O2 -static -L$TMP_DIR/lib -Xlinker -R -Xlinker $TMP_DIR/lib -static -o opimport opimport.o libabi.a ../libdb/libodb.a ../libopt++/libopt++.a ../libutil++/libutil++.a ../libutil/libutil.a -lpopt -liberty -ldl

cd -

#(5)Last step
cd ..
cp oprofile-0.9.8/utils/op-check-perfevents bin/
cp oprofile-0.9.8/utils/ophelp bin/
cp oprofile-0.9.8/utils/opcontrol bin/
cp oprofile-0.9.8/pp/opannotate bin/
cp oprofile-0.9.8/pp/oparchive bin/
cp oprofile-0.9.8/pp/opgprof bin/
cp oprofile-0.9.8/pp/opreport bin/
cp oprofile-0.9.8/opjitconv/opjitconv bin/
cp oprofile-0.9.8/libabi/opimport bin/
cp oprofile-0.9.8/daemon/oprofiled bin/
chmod 755 bin/*

#将这个bin下的东西挂载到设备上

3、内核和打包坏境修改

(1)内核需要支持
选择内核的配置选项
General setup  --->  
 [*] Profiling support 
  <*> OProfile system profiling

(2)busybox需要选择上oprofile使用的命令
tr, dirname, expr, id, which, pidof, grep, seq
另外,dirname\which 需要软连接到/usr/bin目录下

(3)在打包中创建root目录
在fstab中添加如下语句
tmpfs           /root           tmpfs   defaults        0       0
在/etc/mtab中
nodev /dev/oprofile oprofilefs rw 0 0

(4)将上面编译出来的所有bin文件挂载到设备上

4、基本使用方法

将bin挂载到设备后,进入挂载目录运行:

./opcontrol --reset
mount -t oprofilefs nodev /dev/oprofile
./opcontrol --reset
./opcontrol --init
#./opcontrol --no-vmlinux 
./opcontrol --vmlinux=./vmlinux
./opcontrol --start
./<应用程序,使用DEBUG版本>
./opcontrol --dump
./opcontrol --stop
<./opcontrol --shutdown>
./opreport -l(./opreport -l din1_debug) 查看函数级的分析结果

./opannotate --source   查看代码级别的分析结果

5、可能会出现的问题及解决方法

(1)编译出现undefined "query_module "
解决方法:oprofile-0.9.8/daemon/liblegacy/p_module.h中添加:
__attribute__((weak))

(2)opcontrol --reset出现如下错误1
Kernel support not available, missing opcontrol --init as root ?
解决方法:

在/etc/mtab中
nodev /dev/oprofile oprofilefs rw 0 0

(3)opcontrol --init出现如下错误2
cat: can't open '/dev/oprofile/cpu_type': No such file or directory
直接挂载mount -t oprofilefs nodev /dev/oprofile,如下错误:
mount: mounting nodev on /dev/oprofile failed: No such file or directory

需要先opcontrol --reset
再mount -t oprofilefs nodev /dev/oprofile

(4)./opcontrol --start
objdump is not installed on this system, use opcontrol --kernel-range=start,end or opcontrol --xen-range= or install objdump
由于在分析内核时使用到objdump,复制binutils-2.21.1/binutils/objdump 至文件系统的/bin文件下。(objdump在符号分析时用到)

移植oprofile到海思相关推荐

  1. OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/123696821 各位读者,知识无穷而人力有穷 ...

  2. 海思3559移植yolov3

    此人博客上有完整教程: https://blog.csdn.net/avideointerfaces/article/category/8762084 海思3559移植yolov3 海思AI芯片(Hi ...

  3. 海思Hi3559A平台移植 opencv4.0.0

    原文:https://blog.csdn.net/xclshwd/article/details/85257117 海思Hi3559A平台移植 opencv4.0.0 2018年12月26日 09:5 ...

  4. python交叉编译_交叉编译Python3.6.2,使用海思arm-hisiv200-linux-gcc,移植到arm开发板上...

    最近在学习Python,感觉使用Python可以快速的写出程序,比之前使用的C语言快多了,能省出很多时间.多学一点知识有更多的选择.本职工作是嵌入式开发,学习了Python后想移植到开发板上,尝试嵌入 ...

  5. 海思芯片怎么使用tde给qt加速_基于Hisi芯片,交叉编译、移植Qt4.8.6(可旋转)

    一.安装海思编译链 安装海思编译链(如arm-hisiv300-linux-*),不做赘述. 二.下载Qt4.8.6源码包 源码包:qt-everywhere-opensource-src-4.8.6 ...

  6. 海思芯片怎么使用tde给qt加速_3519移植Qt适配附件

    [实例简介] 修改Qt5.5.1linuxfb插件代码,适配海思3519平台 [实例截图] [核心代码] 3519Qt移植.tar ├── 3519Qt绉绘 │   ├── linuxfb │   ...

  7. 海思Hi3559AV100移植Qt5.9.9(一)

    目录 前言 1 基础环境搭建 1.1 概述 1.2 Ubuntu虚拟机安装 1.2.1 准备 1.2.2 安装 1.3 软件包安装 2 安装编译SDK 2.1 准备 2.2 解压缩SDK 2.3 展开 ...

  8. mysql移植海思_live555 交叉编译移植到海思开发板

    1.首先到它的主页下载一个源码包: http://www.live555.com/liveMedia/public/ 我下载的是latest的,具体什么版本还真不清楚 2.放到linux目录下解压: ...

  9. HI3515海思开发板移植3G模块笔记

    硬件平台: 海思Hi3515 Linux 3G模块: 1.移动模块:ZTE M305(TD-SCDMA) 2.联通模块:HUAWEI EM770W(WCDMA) 3.电信模块:HUAWEI EM660 ...

  10. 海思3519上移植Qt5.5.1

    1. 源码下载 网址:http://download.qt.io/archive/qt/5.5/5.5.1/single/ 源码包: qt-everywhere-opensource-src-5.5. ...

最新文章

  1. java基础(十三)-----详解内部类——Java高级开发必须懂的
  2. 关于Linux前后台程序切换
  3. 将存储过程的返回值赋给变量
  4. 一份传世典文:十年编程(Teach Yourself Programming in Ten Years)
  5. c语言宏定义_掌握C语言,中文编程不是梦
  6. boost::python::def相关的测试程序
  7. OCM备考 三. Managing Database Availability 之flashback
  8. 06 / LiveVideoStack主编观察:六岁的Frame.io被收购
  9. 「递归」第5集 | 从网瘾少年到极客大神:没有什么是一段代码解决不了的
  10. 公司用的非标普通自动化用单片机还是plc_PLC的介绍
  11. 服务器共享文件夹权限设置软件,局域网共享文件访问控制软件、共享文件夹权限设置软件的使用方法...
  12. C语言的argv小案例
  13. if--(else)语句,getchar()和putchar()、、||、!逻辑运算符
  14. Spark 训练机器学习模型莫名报错(java.lang.stackoverflow)
  15. 动态数据源,帆软报表同一个sql语句,根据不同的角色使用不同的连接
  16. python分号报错_go、java已经python中分号的使用
  17. 802.11 ------ Beacon帧、Beacon Interval、TBTT、Listen Interval、TIM、DTIM
  18. 基于JAVA-超市会员积分管理系统-计算机毕业设计源码+系统+lw文档+部署
  19. ubuntu从tty终端模式返回到图形桌面
  20. foxmail不能添加google账户

热门文章

  1. 从日志中截取某个时间段的日志分析
  2. noip_最后一遍_2-图论部分
  3. PCIE设备与HOST之间的地址转换
  4. 如何使用jquery ,浏览器窗口滚动到一定距离,显示div中的内容
  5. 十月第一周学习进度条
  6. vi下的查找替换命令
  7. 网站性能工具-YSlow的23个规则-网站性能优化
  8. spring2中jpa的配置和使用
  9. [恢]hdu 2003
  10. 学习自查:目录(更新中...)