bcc工具上手指南

背景

Android平台上,是利用adeb工具来做到bcc工具在Android系统上的快速部署。一旦bcc工具在Android系统上部署完毕,我们就会很方便地利用现有的ebpf工具,进行系统开发或者调试。

另外,也可以在部署好的bcc环境里面,做自己的ebpf工具定制开发。

adeb简介

adeb主页:https://github.com/joelagnel/adeb

bcc工具主页:https://github.com/iovisor/bcc

adeb又名androdeb, 它在Android手机上,搭建了一个基于命令行的debian操作系统,就是可以使手机同时跑Android系统和debian系统。

用户通过chroot的方式,即可在手机里登录到该debian系统里面。在该系统里,可以干任何我们在debian系统里面干的事情。比如vim编辑文件,用gcc或者其他编译工具

开发c, perl或者Python程序,还有可以用apt-get去远程下载安装缺失的软件包。

该系统现在已经自带有bcc工具包。

所以我们可以一边在手机Android桌面上跑比如androbench 测试app,一边chroot到debian系统里面用bcc工具分析androbench产生的IO workload状况。

bcc工具使用介绍

手机需满足的条件

bcc工具目前支持的平台和Android版本是有限的,该工具如果要成功运行起来,手机需要满足以下条件

硬件方面:

必须是arm64平台,手机data分区剩余空间得大于2GB。

软件方面:

Android版本得是大于或者等于N,并且能够成功执行adb root.

内核必须是4.9或者以上的版本,必须得成功开启如下配置项:

CONFIG_KPROBES=y
CONFIG_KPROBE_EVENT=y
CONFIG_BPF_SYSCALL=y
CONFIG_IKHEADERS=y

手机bcc环境搭建

1: 开启待运行bcc工具的内核里面ebpf支持,只需要打开上面提的4个内核配置项即可。

以e1-q版本为例,带如下changes,还有环境变量:TEMPORARY_DISABLE_PATH_RESTRICTIONS=true,重打包即可。

modify gen_kheaders.sh for ebpf support

add ebpf support

2: 下载adeb和bcc工具包, 把adeb.tgz和androdeb-fs.tgz下载到主机端,解压adeb.tgz,解压后的目录为adeb。

3: 部署bcc环境到手机端,执行命令如下:

 cd adeb

sudo ln -s $(pwd)/adeb /usr/bin/adeb

adeb prepare --archive /XXX/androdeb-fs.tgz  (该文件即为上面步骤中已下载的bcc工具包)

4: 执行命令:adeb shell opensnoop,检验是否可以成功在手机里面运行bcc工具。

如果无报错,能成功运行的话,说明手机的bcc开发环境已经搭建成功了。

使用现有工具开发

手机能正常执行adb shell时,只要执行adeb shell,便可进入bcc开发环境中。

1: 使用介绍

该环境中已经自带很多ebpf工具,可以直接用来做Android系统调试开发工作,具体使用方法详见另外一篇博文中的现有ebpf工具介绍一节。

BCC工具在手机Android系统开发方面的优势

2: 常见的错误及解决方法

Exception: Failed to compile BPF text

这个是因为ebpf工具要正常运行,得有内核头文件的支持。如今内核头文件存在于Android系统/proc/kernel/kheaders.tar.xz文件中。

报上面错误,是因为或者上面的kheader文件本身就不存在,或者bcc工具不能正确解压该kheader压缩包,使用不了里面的内核头文件。

之前在e1-q平台碰到这个错误的原因是bcc工具不能正确解压kheader压缩包,解决方法正是带上面提的changes :899508和

环境变量:TEMPORARY_DISABLE_PATH_RESTRICTIONS=true,去重新编译内核。

带环境变量的原因详见下面链接:

https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools

自定制ebpf工具

由于手机里面的各种业务场景千变万化,现有ebpf工具还不能满足我们的需求,还需要自己针对特殊的业务场景(比如zip解压缩,androbench测评)去做新的ebpf工具。

1:ebpf工具实现原理

现有的ebpf工具是由Python脚本做成的,内部由Python 代码区和BPF program区组成。

Python 代码区:

1) 调用一些特殊的Python库接口,该接口是native层ebpf接口的进一步抽象封装,可以完成ebpf代码的编译和插入内核执行。

里面完成的重要事情有:调用attach_kprobe接口,去把ebpf目标码注入到待跟踪的内核函数中,完成对该内核函数的监控和行为修正。

2) 使用传统的Python工具库接口,比如字典,hash等,完成对监控内核输出数据的进一步统计和条件过滤工作。

BPF program区:

该区域是以bpf_text="""开头,以"""结尾的,里面是C语言代码,主要完成自定义内核监控或者调试行为。

2:ebpf工具开发指南

FAQ:

https://github.com/iovisor/bcc/blob/master/FAQ.txt

bcc开发Reference Guide:

https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md

bcc Tutorial:

https://github.com/iovisor/bcc/blob/master/docs/tutorial.md

bcc Python Developer Tutorial:

https://github.com/iovisor/bcc/blob/master/docs/tutorial_bcc_python_developer.md

你可能感兴趣的:(os工作经历)