關於oprofile的移植,在Ubuntu Server 10.04平台上交叉編譯,移植到Android,經過實踐,以下是交叉編譯的正確步驟,不保證在其他環境中能正確運行,以下是編譯環境:
build: Ubuntu Server 10.04
host: Android-2.2r2
cross compiler: mips-linux-gnu-gcc version:4.3.2
cpu: mips
交叉編譯oprofile,依賴(popt,binutils);
1.Download Open Source:
popt-1.14.tar.gz
binutils-2.21.tar.gz
oprofile-0.9.6.tar.gz
2.Building environment
重要:
touch env.sh
vi env.sh
內容如下:
export PATH=/home/gzshun/share/mips-4.3/bin:$PATH ##修改為自己的工具鏈路徑
export CC="mips-linux-gnu-gcc -EL"
export CXX="mips-linux-gnu-g++ -EL"
export CFLAGS=-static
export CXXFLAGS=-static
export CPPFLAGS=-static
source env.sh
3.Building popt-1.14.tar.gz
tar zxvf popt-1.14.tar.gz
cd popt-1.14
ac_cv_va_copy=yes ./configure --with-kernel-support --host=mips-linux-gnu --prefix=/home/gzshun/popt
make
make install
以下是靜態編譯:
4.Building binutils-2.21.tar.gz
tar zxvf binutils-2.21.tar.gz
cd binutils-2.21
./configure --with-kernel-support --host=mips-linux-gnu --prefix=/home/gzshun/binutils --enable-shared
make configure-host
make LDFLAGS="-all-static"
make install
5.Building oprofile-0.9.6.tar.gz
tar zxvf oprofile-0.9.6.tar.gz
cd oprofile-0.9.6
./configure --with-kernel-support --host=mips-linux-gnu --prefix=/home/gzshun/oprofile/ --with-extra-libs=/home/gzshun/popt/lib/ --with-extra-includes=/home/gzshun/popt/include/ --with-binutils=/home/gzshun/binutils
make LDFLAGS="-all-static -L/home/gzshun/binutils/lib -Xlinker -R -Xlinker /home/gzshun/binutils/lib -L/home/gzshun/popt/lib/"
make install
6.添加內核oprofile模塊
General setup --->
[*] Profiling support (EXPERIMENTAL)
<*> OProfile system profiling (EXPERIMENTAL)
將oprofile模塊編進內核,也可以編程模塊
開發板性能測試篇:
1.注意
a.在ubuntu編譯oprofile的生成路徑是:/home/gzshun/oprofile,所以在開發板也需要建立相應的路徑
mkdir -p /home/gzshun/
將生成的oprofile目錄拷貝到開發板/home/gzshun/目錄下
##原因:在ubuntu環境下編譯,oprofile會按照原本在ubuntu的路徑尋找需要的lib庫。(生成目錄自己定)
b.修改oprofile/bin/opcontrol第1968行,將/usr/bin修改為/bin
c.在Android系統中的/etc目錄下新建mtab文件,並添加內容:nodev /dev/oprofile oprofilefs rw 0 0
d.在開發板設置oprofile的環境變量,必須放在PATH的前面,因為原Android系統也存在2個命令。
e.oprofile生成報告的默認地址是:/var/lib/oprofile
2.性能測試
##Android沒有內核,所以需要從虛擬地址去引用vmlinux
grep "_stext" /proc/kallsyms --> result: 84000400 T _stext ##獲取vmlinux虛擬的起始地址
grep "_etext" /proc/kallsyms --> result: 84342a18 A _etext ##獲取vmlinux虛擬的結束地址
opcontrol --init --> 提示錯誤,掛載oprofilefs即可
mount -t oprofilefs nodev /dev/oprofile ##掛載oprofile需要的設備信息
opcontrol --init ##初始化
opcontrol --reset ##清空上次保留下來的信息
echo 0 > /data/vmlinux ##生成一個虛擬的vmlinux
opcontrol --callgraph=2 --vmlinux=/data/vmlinux --kernel-range=0x84000400,0x84342a18 ##起始地址,結束地址, 跟蹤內核
或者 opcontrol --setup --callgraph=2 --no-vmlinux ##不跟蹤 內核
opcontrol --setup --event=CYCLES:7500:0:0:1 ##事件采樣
opcontrol --start ##開始測試性能
opcontrol --status ##查看狀態
.....等待時間,測試
opcontrol --dump ##將測試性能信息寫入磁盤。
opreport ##打印報告
opcontrol --stop ##停止檢測
opcontrol --shutdown ##關閉檢測守護進程
opcontrol --deinit ##卸載oprofile內核模塊
opreport出來的一個例子:
分析:
Samples 采樣到的次數
% 占的百分比
Symbol name 函數名
Android@localhost:/# opreport
Overflow stats not available
CPU: MIPS 24K, speed 0 MHz (estimated)
Counted CYCLES events (Cycles) with a unit mask of 0x00 (No unit mask) count 7500
CYCLES:7500
samples| %
------------------
132594 18.2787 opreport
103155 14.2204 libdvm.so
96514 13.3049 libc.so
88463 12.1950 libskia.so
79213 10.9199 app_process
CYCLES:7500
samples| %
------------------
79213 100.000 [heap] (tgid:1444 range:0x83000-0x401000)
77023 10.6180 oprofiled
57865 7.9770 libcutils.so
19547 2.6946 busybox
17571 2.4222 libwebcore.so
13223 1.8229 libplayback.so
9490 1.3082 libdisplay.so
3906 0.5385 libbinder.so
3816 0.5261 libutils.so
3374 0.4651 ophelp
3373 0.4650 libandroid_runtime.so
2069 0.2852 libcore.so
1816 0.2503 libz.so
1648 0.2272 libsqlite.so
1342 0.1850 dalvik-jit-code-cache (deleted)
1141 0.1573 vmlinux
1110 0.1530 libui.so
975 0.1344 libsurfaceflinger.so
840 0.1158 libGLES_android.so
711 0.0980 libhw.so
604 0.0833 example_display
591 0.0815 libpixelflinger.so
528 0.0728 libsurfaceflinger_client.so
522 0.0720 linker
494 0.0681 libicuuc.so
467 0.0644 libdcchd_android.so
293 0.0404 libnativehelper.so
169 0.0233 libm.so
158 0.0218 uinput
132 0.0182 gralloc.smp86xx.so
117 0.0161 libicui18n.so
98 0.0135 copybit.smp86xx.so
75 0.0103 libstdc++.so
58 0.0080 libEGL.so
58 0.0080 libhardware.so
57 0.0079 libGLESv1_CM.so
46 0.0063 librmlibplay_default_plugin.so
35 0.0048 opjitconv
32 0.0044 libandroid_servers.so
22 0.0030 libhardware_legacy.so
15 0.0021 liblog.so
11 0.0015 servicemanager
10 0.0014 libmedia.so
9 0.0012 adbd
8 0.0011 logwrapper
5 6.9e-04 libmediaplayerservice.so
4 5.5e-04 libmedia_jni.so
3 4.1e-04 libsysutils.so
1 1.4e-04 init
1 1.4e-04 libemoji.so