跳转至

Ebpf udst初探 libstapsdt的使用

ebpf udst初探

ebpf udst, 静态跟踪点(tracepoint),在用户空间也被称为USDT(用户静态定义跟踪)探针,是应用程序感兴趣的特定位置,可以在其中挂载跟踪器来检查数据和代码执行情况。

用户程序添加udst,采用libstapsdt。

Text Only
https://github.com/sthima/libstapsdt

安装libstapsdt

参考git地址,源码编译安装

安装bcc

Text Only
sudo apt-get install bpfcc-tools linux-headers-$(uname -r) 

demo讲解

demo程序启动命令:

Text Only
./demo PROVIDER_NAME PROBE_NAME

启动libstapsdt的demo程序,该程序将argv[1](也就是命令行参数1)传递给了providerInit()函数,将argv[2]传递给providerAddProbe()函数。

Text Only
1
2
3
4
  provider = providerInit(argv[1]);
  for (int idx = 0; idx < (probesCount); idx++) {
    probes[idx] = providerAddProbe(provider, argv[idx + 2], 2, uint64, int64);
  }
如上代码所示,probe的name为PROBE_NAME,捕获两个参数,均为uint64类型。

使用fire函数触发probe,传递i和j两个uint64值,这两个值可以在观测probe时获取到。

Text Only
probeFire(probes[idx], i++, j--);

demo程序终端打印如下:

Text Only
Firing probes...
Firing probe [0]...
Probe fired!
Firing probes...
Firing probe [0]...
Probe fired!
Firing probes...
Firing probe [0]...
Probe fired!
Firing probes...
Firing probe [0]...

启动bcc的trace程序进行跟踪探测点,打印捕获到的probe触发时传入的参数。

Text Only
sudo /sbin/trace-bpfcc -p (pgrep demo) 'u::PROBE_NAME "i=%d j=%d", arg1, arg2'

bcc trace终端打印如下:

Text Only
1
2
3
4
5
6
7
8
9
PID     TID     COMM            FUNC             -
10958   10958   demo            PROBE_NAME       i=3 j=-3
10958   10958   demo            PROBE_NAME       i=4 j=-4
10958   10958   demo            PROBE_NAME       i=5 j=-5
10958   10958   demo            PROBE_NAME       i=6 j=-6
10958   10958   demo            PROBE_NAME       i=7 j=-7
10958   10958   demo            PROBE_NAME       i=8 j=-8
10958   10958   demo            PROBE_NAME       i=9 j=-9
10958   10958   demo            PROBE_NAME       i=10 j=-10