systemtap在android、pandaboard上的移植

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主机。

下载systemtap源码

不同的android内核对应着不同的systemtap版本(systemtap在OMAP上没有做到向下兼容),我的pandaboard上运行的kernel是omap-pand-3.0(linux kernel3.0),对应的systemtap版本是1.5,从http://sourceware.org/systemtap/ftp/releases/下载对应的版本。

编译systemtap安装在ubuntu

         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


编译systemtap安装在pandaboard

       在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

         修改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的内核了。

编译android

         将编译生成的arch/arm/boot/zImage文件,替换掉android源码中的device/ti/panda/kernel文件,然后重新编译android源码,结束后将相关文件烧写到pandaboard上,详情参见:http://blog.csdn.net/lzuzhp06/article/details/7716452。

交叉编译systemtap脚本

         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源码所在的文件。

向pandaboard拷贝交叉编译文件

         由于采用的是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());

}

你可能感兴趣的:(android,ubuntu,include,makefile,编译器,profiling)