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. 顶级围棋AI被发现漏洞:“超人类人工智能”还有很长的路?

    原文地址: https://www.bjnews.com.cn/detail/1720537986168936.html 参考资料: (1)Can AI be superhuman? Flaws in ...

  2. 【转载】大模型时代的PDF解析工具

    本文来自博客园,作者:叶伟民,转载请注明原文链接:https://www.cnblogs.com/adalovelacer/p/18092208/pdf-tools-for-large-languag ...

  3. jax框架为例:求hession矩阵时前后向模式的自动求导的性能差别

    注意:本文相关基础知识不介绍. 给出代码: from jax import jacfwd, jacrev import jax.numpy as jnp def hessian_1(f): retur ...

  4. ubuntu18.04系统环境下使用vs code安装pylint检查python的代码错误

    相关: Ubuntu18.04 系统环境下 vscode中忽略pylint某些错误或警告 ============================================ python的代码错 ...

  5. 【转载】 Sun RPC 编程简介

    原文地址: http://blog.chinaunix.net/uid-1724205-id-2813082.html ======================================== ...

  6. Ubuntu18.04server 双网卡,开机自动设置路由并启动校园网网络认证程序(Ubuntu开机自动设置路由,开机自启动应用程序)

    本博主为高龄在校生,实验室服务器需要假期时候无人守候也能实现自动登录校园网从而实现网络连接,以使实验室同学在家也可以使用校园vpn连接服务器. 由于假期时候实验室没有人,而假期实验室可能会出现断电断网 ...

  7. Java基础之数值类型之间的转换

    经常需要将一种数值类型转换为另一种数值类型.下图 给出了数值类型之间的合法 转换. 在图中有 6 个实心箭头,表示无信息丢失的转换:有 3 个虚箭头, 表示可能有精度 损失的转换. 例如,123 45 ...

  8. 暑假Java自学进度总结05

    一.今日所学: 1.if的第一个表达式: if(关系表达式){ 语句: } 执行流程: 1>首先执行关系表达式的值 2>如果关系表达式的值为true则执行语句,否则不执行 3>继续执 ...

  9. 使用jquery的tmpl构建复杂表格

    Tmpl提供了几种tag:${}:等同于{{=}},是输出变量,通过了html编码的.{{html}}:输出变量html,但是没有html编码,适合输出html代码.{{if }} {{else}}: ...

  10. CF Div3 962 E-F

    CF Div3 962 E-F E. Decode 链接: Problem - E - Codeforces 简要题意: 给你一个长度为 \(n\) 的二进制字符串\(s\) .对于每一对整数\((l ...