参考网站:
http://omappedia.org/wiki/Systemtap
http://blog.csdn.net/lzuzhp06/article/details/7778189
http://blog.csdn.net/sunnybeike/article/details/7794183
http://pastebin.com/Fka5h427
http://fosiao.com/node/19#comment-13
步骤一:编译host端和omap端的systemtap
host端的systemtap通过交叉编译将stp脚本生成ko文件,而omap端的systemtap将来要拷贝到pandaboard中,用来执行上面这个ko脚本。
你需要下载的东西:
1. systemtap 1.5
2. elfutils0.143
3. arm-linux-4.4.3(搭建arm linux的交叉编译环境)
我开始的时候用gcc4.6,但是有错,用gcc4.5就不会出现相同的错误了。
编译:
(1)生成host端的systemtap
- ./configure --exec-prefix=/home/sun/zhp/systemtap/hostSystemtap --prefix=/home/sun/zhp/systemtap/hostSystemtap --with-elfutils=/home/sun/zhp/systemtap/elfutils-0.143
- make install
(20)生成arm target端的systemtap
- ac_cv_file__usr_include_avahi_common=no ac_cv_file__usr_include_avahi_client=no ac_cv_file__usr_include_nspr=no ac_cv_file__usr_include_nspr4=no ac_cv_file__usr_include_nss=no ac_cv_file__usr_include_nss3=no ac_cv_func_malloc_0_nonnull=yes ./configure --exec-prefix=/home/sun/zhp/systemtap/omapSystemtap --prefix=/home/sun/zhp/systemtap/omapSystemtap --host=arm-none-linux-gnueabi CXXFLAGS=-static CFLAGS=-static --with-elfutils=/home/sun/zhp/systemtap/elfutils-0.143 --disable-translator --disable-docs --disable-refdocs --disable-grapher --without-rpm
-
-
- make install
步骤二:重新编译android内核,并代替原来的内核
主要是包含进去调试信息。
(1)下载内核
- #in case you need kernel source(normally you don't need this)
- $git clone https://android.googlesource.com/kernel/omap.git
- $cd omap
- $git checkout origin/android-omap-panda-3.0
(2)编译内核
- #修改Makefile文件
- ARCH ?= arm #将体系结构指定为ARM
- CROSS_COMPILE ?= /home/sun/zhp/android/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
#这个交叉编译工具应该是和你编译android用的编译器一样的,这个编译器包含在你下载的android原码中
(3)生成配置文件
- $make panda_defconfig
- $make menuconfig
修改menuconfig:
- CONFIG_KPROBES: General Setup -> Kprobes
- CONFIG_RELAY: General Setup -> user spacerelay support
- CONFIG_PROFILING: General Setup -> Profilingsupport (EXPERIMENTAL) + General Setup -> Oprofile system profiling(EXPERIMENTAL)
(4)修改kernel/arch/arm/include/asm/ptrace.h文件如下:
- #defineinterrupts_enabled(regs) \
- (!((regs)->ARM_cpsr & PSR_I_BIT))
- #definefast_interrupts_enabled(regs) \
- (!((regs)->ARM_cpsr & PSR_F_BIT))
-
- ++ #define condition_codes(regs) \
- ++ ((regs)->ARM_cpsr &(PSR_V_BIT|PSR_C_BIT|PSR_Z_BIT|PSR_N_BIT))
(5)编译
$make
(6)用新生成的arch/arm/boot/zImage替换原来android中的device/ti/panda/kernel
(7)重新编译android原码
步骤三:将新生成的android可执行文件拷贝到pandaboard中:
- #do not insert SD card, reboot the board
- $sudo device/ti/panda/usbboot device/ti/panda/bootloader.bin
- #now insert the SD card
- $sudo out/host/linux-x86/bin/fastboot oem format
- $sudo out/host/linux-x86/bin/fastboot flash xloader device/ti/panda/xloader.bin
- $sudo out/host/linux-x86/bin/fastboot flash bootloader device/ti/panda/bootloader.bin
- #reboot the board to fastboot mode again(hold user button, then toggle power button)
- $sudo out/host/linux-x86/bin/fastboot erase cache
- $sudo out/host/linux-x86/bin/fastboot -p panda flash userdata
- $sudo out/host/linux-x86/bin/fastboot -p panda flashall
- #pandaboard will autoreboot
- $adb shell date $(date +%s)
- $adb shell dhcpcd eth0
- #now have fun :)
步骤四:向pandaboard中拷贝systemtap的omap端的文件
(1)
- $adp push /home/sun/zhp/systemtap/omapSystemtap /data/omapSystemtap
(2)设置执行环境
- $adb shell #进入到android的文件系统中
- $mount -o remount,rw rootfs / #重新挂在文件系统,使其为可读写的
- $mkdir -p /home/sun/zhp/systemtap #注意这个文件夹的路径要和你在主机上保存omapSystemtap的路径相同
- $ln -s /data/omapSystemtap /home/sun/zhp/systemtap/omapSystemtap
最后一步可能出现link failed File exists的错误,解决方法:
退出到主机环境,然后:
- $ adb shell sync
- $ adb reboot
- $ adb wait-for-device shell
如果还是不行,则考虑重新烧写pandaboard,然后重新执行上面的命令。
这里有个问题,为什么要建立上面的软链接?
我猜想,在主机上编译systemtap的时候,肯能将systemtap的绝对路径写到了某个可执行文件中,然而这个路径在pandaboard中的android中是没有的,因此
可以通过建立软链接的方式,解决这个问题,否则会出现找不到某个文件的错误。
步骤五:在主机上交叉编译生成ko文件
- $./home/sun/zhp/systemtap/hostSystemtap/stap -gv -a arm -BCROSS_COMPILE=arm-none-linux-gnueabi- -r /home/sun/zhp/android/omap -m syscall_all.ko syscall_all.stp
其中/home/sun/zhp/systemtap/hostSystemtap/stap是你在第一步编译生成的host端的stap,/home/sun/zhp/android/omap是你下载的,编译过后用来替换android的kernel的内核原码,syscall_all.stp是你自己写的测试脚本,如下:
- probe kernel.function("sys_*") {
- printf("%s(%d) %s\n",execname(),pid(),probefunc());
- }
最终生成syscall_all.ko文件。
步骤六:在panaboard中执行syscall_all.ko文件
(1)将ko文件拷贝到panaboard中:
- $adb push /home/sun/zhp/systemtap/hostSystemtap/bin/syscall_all.ko /data/local
(2)执行
- #cd /data/omapSystemtap/bin/
- #./staprun /data/local/syscall_all.ko
JUST ENJOY IT!
完工!