1 Overview

ply 是 eBPF 的 front-end 前端工具之一,专为 embedded Linux systems 开发,采用 C 语言编写,只需 libc 和内核支持 BPF 就可以运行,不需要外部 kernel 模块,不需要 LLVM,不需要 python。

ply 由瑞典工程师 Tobias Waldekranz 开发,其项目主页是 PLY Light-weight Dynamic Tracer for Linux 。

使用非常灵活和轻量级,编辑一种类 C 语言的脚本,然后利用内核 eBPF 来收集和探测内核数据,比如打印出内核函数的调用栈,获取内核变量等,是学习内核,进行嵌入式 Linux 系统开发调试的利器!

本文记录 ply 的编译及使用过程,实验例程源码都已上传到 https://github.com/jgsun/buildroot。

2 内核配置

注意: 为顺利使用 ply,内核需要比较新的版本,并且支持 eBPF 和 FTRACE,选择如下配置:

CONFIG_KPROBES=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_FTRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y

本文实验中所采用内核版本为 Linux v5.8.4。

3 ply 编译

3.1 交叉编译

请提前准备好交叉编译器,大部分 Linux 发行版都提供 ARM64 交叉编译器,直接用包管理工具安装即可,以 Ubuntu 为例:

$ sudo apt-get install gcc-aarch64-linux-gnu

交叉编译步骤举例如下:

$ git clone https://github.com/wkz/ply
$ ./autogen.sh
// 先安装到本地目录下
$ ./configure --host=aarch64-linux-gnu --prefix=~/usr
$ make
$ make install

查看安装目录 ~/usr:

~/usr$ tree
.
|-- include
| `-- ply
| |-- arch.h
| |-- buffer.h
| |-- func.h
| |-- internal.h
| |-- ir.h
| |-- kallsyms.h
| |-- node.h
| |-- perf_event.h
| |-- ply.h
| |-- printxf.h
| |-- provider.h
| |-- sym.h
| |-- syscall.h
| |-- type.h
| `-- utils.h
|-- lib
| |-- libply.a
| |-- libply.la
| |-- libply.so -> libply.so.0.0.0
| |-- libply.so.0 -> libply.so.0.0.0
| `-- libply.so.0.0.0
|-- sbin
| `-- ply
`-- share
`-- doc
`-- ply
|-- COPYING
`-- README.md
7 directories, 23 files

将 lib 目录的库文件和 sbin 目录的可执行文件 ply 拷贝到 target 板卡的文件系统即可使用,例如:

主机:

~/usr$ scp -P 22 lib/* root@192.168.122.46:/lib
~/usr$ scp -P 22 sbin/ply root@192.168.122.46:~/bin

3.2 使用 buildroot 编译

ply 项目采用 GNU’s autotools build 系统,非常容易集成到 buildroot,首先在 buildroot 添加 ply package,然后执行 make ply 编译即可。

可以从 buildroot/package/ply 下载,也可以参考下述 patch 修改:

diff --git a/package/Config.in b/package/Config.in
index cb6d8e0e01..7dd278242e 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -2321,6 +2321,7 @@ menu "System tools"
source "package/openrc/Config.in"
source "package/openvmtools/Config.in"
source "package/pamtester/Config.in"
+ source "package/ply/Config.in"
source "package/polkit/Config.in"
source "package/powerpc-utils/Config.in"
source "package/procps-ng/Config.in"
diff --git a/package/ply/.Config.in.swp b/package/ply/.Config.in.swp
new file mode 100644
index 0000000000..1193f698fb
Binary files /dev/null and b/package/ply/.Config.in.swp differ
diff --git a/package/ply/Config.in b/package/ply/Config.in
new file mode 100644
index 0000000000..258a59b6fd
--- /dev/null
+++ b/package/ply/Config.in
@@ -0,0 +1,11 @@
+config BR2_PACKAGE_PLY
+ bool "ply"
+ depends on BR2_x86_64 || BR2_aarch64 || BR2_arm || BR2_ppc # needs <cpuid.h>
+ depends on BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_GLIBC
+ help
+ ply dynamically instruments the running kernel to aggregate and
+ extract user-defined data. It compiles an input program to one or
+ more Linux bpf(2) binaries and attaches them to arbitrary points
+ in the kernel using kprobes and tracepoints.
+
+ https://wkz.github.io/ply/
diff --git a/package/ply/ply.mk b/package/ply/ply.mk
new file mode 100644
index 0000000000..298ea4acf2
--- /dev/null
+++ b/package/ply/ply.mk
@@ -0,0 +1,15 @@
+################################################################################
+#
+# ply
+#
+################################################################################
+
+PLY_VERSION = 2.1.1
+PLY_SITE = https://github.com/wkz/ply/releases/download/$(PLY_VERSION)
+# fetched from Github, with no configure script
+PLY_AUTORECONF = YES
+PLY_DEPENDENCIES = host-bison host-flex
+PLY_LICENSE = GPL-2.0+
+PLY_LICENSE_FILES = COPYING
+
+$(eval $(autotools-package))

4 ply 示例

网址 root/ply 有部分示例。clone 编译可直接使用:

$ git clone https://github.com/jgsun/buildroot
$ cd buildroot && make qemu_aarch64_virt-fun_defconfig && make
$ qemu-system-aarch64 -M virt \
-cpu cortex-a57 -nographic -smp 4 -m 512 \
-kernel output/images/Image \
-append "root=/dev/ram0 console=ttyAMA0 kmemleak=on loglevel=8" \
-netdev type=tap,ifname=tap0,id=eth0,script=board/qemu/scripts/qemu-ifup_virbr0,queues=2 \
-device virtio-net-pci,netdev=eth0,mac='00:00:00:01:00:01',vectors=6,mq=on

4.1 打印出内核函数的调用栈

本 ply 示例打印出函数 rtnetlink_rcv 的调用栈:ddd

root@~# cat netlink.ply
#!/usr/bin/env ply
kprobe:rtnetlink_rcv
{
print(stack);
}

运行 sshnetlink.ply,然后在另外一个终端通过 ssh 登录 qemu aarch64 board,执行 ip addr show dev eth0 命令:

$ ssh -p 22 root@192.168.122.46
root@~# ip addr show dev eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:00:00:01:00:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.46/24 brd 192.168.122.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::200:ff:fe01:1/64 scope link
valid_lft forever preferred_lft forever

netlink.ply 就会打印出 rtnetlink_rcv 的调用栈:

root@~# ./netlink.ply
ply: active
rtnetlink_rcv
netlink_sendmsg+408
____sys_sendmsg+592
___sys_sendmsg+136
__sys_sendmsg+112
__arm64_sys_sendmsg+40
el0_svc_common.constprop.3+144
do_el0_svc+116
el0_sync_handler+280
el0_sync+320
rtnetlink_rcv
netlink_sendmsg+408
____sys_sendmsg+592
___sys_sendmsg+136
__sys_sendmsg+112
__arm64_sys_sendmsg+40
el0_svc_common.constprop.3+144
do_el0_svc+116
el0_sync_handler+280
el0_sync+320
rtnetlink_rcv
netlink_sendmsg+408
__sys_sendto+224
__arm64_sys_sendto+44
el0_svc_common.constprop.3+144
do_el0_svc+116
el0_sync_handler+280
el0_sync+320

4.2 获取打开文件的进程信息

本 ply 示例打印出发起系统调用 do_sys_open 打开文件的进程名,进程 pid 和文件名(第一个参数):

#!/usr/bin/env ply
kprobe:do_sys_open
{
printf("%v(%v): %s\n",
comm, pid, str(arg1));
}

运行结果:

root@~/ply# ./opensnoop.ply
ply: active
dropbear ( 128): /dev/urandom
dropbear ( 128): /proc/timer_list
syslogd ( 60): /var/log/messages
dropbear ( 128): /proc/interrupts
dropbear ( 128): /proc/loadavg
dropbear ( 128): /proc/sys/kernel/random/entropy_avail
dropbear ( 128): /proc/net/netstat
dropbear ( 128): /proc/net/dev
dropbear ( 128): /proc/net/tcp
dropbear ( 128): /proc/net/rt_cache

推荐一款轻量级 eBPF 前端工具 ply的更多相关文章

  1. 推荐两款远程管理Linux工具(基于Windows系统)

    推荐两款远程管理Linux工具(基于Windows系统) 1.Xshell 百度百科:Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows ...

  2. 推荐一款强大的前端CLI命令行工具

    背景 命令行界面交互开源工具 CloudBase CLI 自发布以来,受到了大量开发者的欢迎.近期,我们发布了新鲜打磨的 CloudBase CLI 1.0 Beta,引入了许多利于开发者的新特性,下 ...

  3. 推荐一款编辑SQL的工具:jsqlparser

    这个工具真的挺好用的,采用的是观察者模式,Visitor. 虽然我学过这个模式,但是乍一用还是有点懵逼的. 给好一个SQL语句之后,jsqlparser可以把这个sql语句给分解成all kind o ...

  4. [工具]推荐一款查看dll依赖工具

    引言 很久没写一篇像样的博客了,最近一个月一直忙于项目,也没时间去总结了,回到家,也就是看看书,没怎么总结.不过还是挺兴奋的,每天过得还算充实.这里也算是对五月份的一个总结吧. 为什么要查看dll 因 ...

  5. 推荐一款轻量级PHP数据库框架–Medoo

    引用官网的简介: 可以加快开发速度的最轻量级的PHP数据库框架 为什么选择Medoo及其主要功能: 轻量级–单个文件,只有20KB 易用–非常容易学习和使用 功能强大–支持各种常见和复杂的SQL查询 ...

  6. 推荐十款非常优秀的 HTML5 在线设计工具

    网络有很多优秀的设计和开发工具可能大家都不知道,因此这篇文章就向设计师推荐十款优秀 HTML5 在线工具,这些工具能够帮助设计师们设计出更有创意的作品.随着 HTML5 技术的不断成熟,网络上涌现出越 ...

  7. 推荐一款MongoDB的客户端管理工具--nosqlbooster

    今天给大家推荐一款MongoDB的客户端工具--nosqlbooster,这个也是我工作中一直使用的连接管理MongoDB的工具.这个工具还有个曾用名--mongobooster.nosqlboost ...

  8. 推荐25款实用的 HTML5 前端框架和开发工具【下篇】

    快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用户桌面应用程序的速度,性能和体验. ...

  9. 推荐一款强大的轻量级模块化WEB前端快速开发框架--UIkit

    前言 今天给大家分享一款强大的轻量级模块化WEB前端快速开发框架--UIkit 到目前(2016-06-20)为止,UIkit在github上的Forks已达到了1350个,而Stars更是达到了69 ...

  10. 推荐25款很棒的 HTML5 开发框架和开发工具【上篇】

    HTML5 在不同的领域让网页设计更强大的.快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站 ...

随机推荐

  1. QT入门学习记录01

    目录 前言 一.Qt安装 二.创建一个Qt工程 三.基类的区别和常用函数 1.QWidget 1.1 设置窗口标题 1.2 设置窗口大小和显示位置 1.3 显示窗口 1.4 隐藏窗口 1.5 改变窗口 ...

  2. Windows报错0xc0000142的处理方法

    1.问题描述 桌面有个弹窗报错(0xc0000142),无法关闭,影响Windows的使用 此错误很有可能是缺少组件导致 2.解决办法 进入" C:\Windows\System32 &qu ...

  3. 【WEB】URL文件

    早些年接触电脑的时候就有这个东西,去网站上下载盗版游戏,网站会附加这种URL文件 双击运行之后是打开浏览器跳转到该文件描述的网址 我从来没想过这东西里面写的是什么 百度经验: https://baij ...

  4. 【Vue】Re03 computed属性计算和ES6的一些补充

    一.Computed属性计算 四种计算处理的方式方法 <!DOCTYPE html> <html lang="en"> <head> <m ...

  5. MindSpore 初探, 使用LeNet训练minist数据集

    如题所述,官网地址: https://www.mindspore.cn/tutorial/zh-CN/r1.2/quick_start.html 数据集下载: mkdir -p ./datasets/ ...

  6. XXL-JOB系统化图文教程

    1.背景 大纲 调度任务在系统中中经常用到, 比如 定时发送营销短信 定时检查订单状态 等等..... 总之我们经常会用到定时任务 官方文档:https://www.xuxueli.com/xxl-j ...

  7. cdq分治 基础篇

    简介 前置芝士:归并排序. \(cdq\) 分治是个离线算法,可以解决三维偏序或者优化 \(dp\). 陌上花开 维护三维偏序有个口诀:一维排序,二维归并,三维数据结构. 考虑第一维直接排序解决掉,然 ...

  8. 疫情远程办公Citrix XenDesktop 2203长期稳定版本虚拟云桌面部署教程

    下面列出来的是目录大纲,里面包含了Citrix完整搭建的教程,此次实验环境是利用Citrix XenDesktop 7.15 CU3长期稳定版虚拟桌面详细安装教程, 含PVS及UPM相关配置,期待视频 ...

  9. int128输入输出流

    using i128 = __int128; istream &operator>>(istream &is, i128 &x) { string s; is &g ...

  10. typeof、offsetof、container_of

      typeof 用于获取一个对象的类型,比如: unsigned int a = 1; // typeof (a) is unsigned int short b = 2; // typeof (b ...