HaiPeng([email protected])
systemtap是一个非常好用的linux调试工具,systemtap从版本1.0开始变支持arm处理器,但是只支持OMAP的,pandaboardES上的处理器是OMAP 4460,由于“工作”需要将systemtap移植到运行android的pandaboard ES上(运行ubuntu的pandaboard直接apt安装就行)。官方资料http://omappedia.org/wiki/Systemtap个人感觉写得不太好,下面简述一下自己的移植过程。
编译成功的主机环境是ubuntu10.04 32bit,在ubuntu 64位上编译报了几个不好解决的错误,索性就在虚拟机中安装32位的ubuntu来作为host主机。
不同的android内核对应着不同的systemtap版本(systemtap在OMAP上没有做到向下兼容),我的pandaboard上运行的kernel是omap-pand-3.0(linux kernel3.0),对应的systemtap版本是1.5,从http://sourceware.org/systemtap/ftp/releases/下载对应的版本。
systemtap要在OMAP上运行,需要在ubuntu主机上生成运行在OMAP上的模块,因此ubuntu主机上也应该有systemtap,在ubuntu上安装systemtap可以采用apt-get的方式(若只是编译运行在OMAP上的模块,则不需要ubuntu的debuginfo信息),也可以采用自己编译的方式
apt-get build_dep systemtap make clean ./configure --exec-prefix=/mnt/work/pandaboard/systemtap-1.5-ubuntu--prefix=/mnt/work/pandaboard/systemtap-1.5-ubuntu make install
在systemtap1.5的源码中执行如下命令,交叉编译systemtap(需要安装交叉编译器,apt-get install gcc-arm-linux-gnueabi)。
ac_cv_file__usr_include_avahi_common=noac_cv_file__usr_include_avahi_client=no ac_cv_file__usr_include_nspr=noac_cv_file__usr_include_nspr4=no ac_cv_file__usr_include_nss=noac_cv_file__usr_include_nss3=no ac_cv_func_malloc_0_nonnull=yes ./configure --exec-prefix=/mnt/work/pandaboard/systemtap-1.5-macharm--prefix=/mnt/work/pandaboard/systemtap-1.5-macharm--host=arm-none-linux-gnueabi CXXFLAGS=-static CFLAGS=-static--disable-translator --disable-docs --disable-refdocs --disable-grapher--without-rpm
修改omap-pand-3.0的Makefile:
ARCH= arm,CROSS_COMPILE=/mnt/work/pandaboard/arm-eabi-4.4.3/bin/arm-eabi-
编译内核的交叉编译器并不是编译systemtap的交叉编译器,而是跟编译android源码的编译器一样(使用systemtap的交叉编译器也可以编译通过,但是运行到pandaboard上会出现鼠标、网卡等不能使用的情况,原因还不知道),这个可以直接从自己下载的android源码中拷贝到ubuntu主机中。
修改完Makefile,执行以下命令,生成.config文件
makepanda_defconfig
systemtap的运行需要内核开启相关调试信息(debug info)选项,我们的systemtap要在pandaboard上运行,因此omap-pand-3.0的kenrel需要开启如下选项:
CONFIG_KPROBES: General Setup -> Kprobes
CONFIG_RELAY: General Setup -> user spacerelay support
CONFIG_PROFILING: General Setup -> Profilingsupport (EXPERIMENTAL) + General Setup -> Oprofile system profiling(EXPERIMENTAL)
修改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)) /* Are thecurrent registers suitable for user mode? * (used to maintain security in signalhandlers) */
目前omap-pand-3.0内核的tickless有bug,详情及处理方法参加:http://blog.csdn.net/lzuzhp06/article/details/7823174
接下来便可以执行make –j2来编译omap-pand-3.0的内核了。
将编译生成的arch/arm/boot/zImage文件,替换掉android源码中的device/ti/panda/kernel文件,然后重新编译android源码,结束后将相关文件烧写到pandaboard上,详情参见:http://blog.csdn.net/lzuzhp06/article/details/7716452。
Systemtap脚本的名字叫syscall_all.stp,在ubuntu主机上交叉编译的命令如下:
stap -gv -a arm -BCROSS_COMPILE=arm-none-linux-gnueabi- -r /mnt/work/pandaboard/omap -msyscall_all.ko syscall_all.stp
/mnt/work/pandaboard/omap是omap-pand-3.0源码所在的文件。
由于采用的是virtualbox虚拟机,因此我先用scp命令将交叉编译systemtap生成的文件systemtap-1.5-macharm、交叉编译生成的模块syscall_all.ko拷贝到64位的物理主机上,然后使用adb的push命令将systemtap-1.5-macharm文件push到开发板的/data目录下,将syscall_all.ko文件push到/data/local目录下。
adb push kprobes/systemtap-1.5-macharm /data/
adb push ./kprobes/syscall_all.ko /data/local/
重新挂在pandaboard的根分区为可读写分区:
mount -o remount,rw rootfs /
然后创建文件及软链接:
mkdir –p /mnt/work/pandaboard/
ln –s /data/ systemtap-1.5-macharm /mnt/work/pandaboard/ systemtap-1.5-macharm
使用staprun命令运行syscall_all.ko模块:
/data/ systemtap-1.5-macharm/bin/staprun/data/local/syscall_all.ko
pandaboard的串口输出结果如下:
… adbd(110) sys_write InputReader(156) sys_clock_gettime InputReader(156) sys_read adbd(110) sys_read InputReader(156) sys_writev InputReader(156) sys_write InputReader(156) sys_epoll_wait adbd(110) sys_read InputReader(156) sys_write InputReader(156) sys_nanosleep adbd(110) sys_select adbd(110) sys_read …
如此你知道syscall_all.stp的内容了吗?
probe kernel.function("sys_*"){ printf("%s(%d) %s\n",execname(),pid(),probefunc()); }