目的
简单验证bpftrace在riscv上的支持情况,为以后使用bpftrace作准备。
编译
我们这里选取branch 0.19.1_release,并且根据INSTALL.md先安装好编译所需的包。
1
2
3
4
5
6
7
8
| $ git clone https://github.com/iovisor/bpftrace
$ cd bpftrace
$ git checkout 0.19.1_release
$ git submodule update --init
$ mkdir build; cd build
$ ../build-libs.h
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PWD/install ..
$ make -j 4 install
|
直接安装
riscv ubuntu-23.10上面apt已经可以直接安装bpftrace.
验证
1
2
3
4
| ubuntu@ubuntu:~$ sudo bpftrace -e 'tracepoint:block:block_rq_issue { printf("%d %s %d\n", pid, comm, args->bytes); }'
Attaching 1 probe...
6135 kworker/u8:3 4096
8112 bash 16384
|
1
2
3
4
5
6
7
8
9
10
| ubuntu@ubuntu:~$ sudo bpftrace -e 'software:faults:1 { @[comm] = count(); }'
Attaching 1 probe...
^C
@[sudo]: 1
@[pool-spawner]: 1
@[packagekitd]: 4
@[systemd]: 21
@[nroff]: 50
@[systemd-journal]: 53
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| ubuntu@ubuntu:~$ cat busy.c
int inc(int i)
{
return i + 1;
}
int main()
{
int i = 0;
while (1)
i = inc(i);
return 0;
}
|
栈的解析还是有瑕疵。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| ubuntu@ubuntu:~$ sudo bpftrace -e 'profile:hz:99 /comm == "busy"/ { @[ustack] = count(); }'
Attaching 1 probe...
^C
@[
inc+0
main+22
0x1
0xfd5ff0ef880a4701
]: 11
@[
main+12
main+22
0x1
0xfd5ff0ef880a4701
]: 32
@[
main+22
main+22
0x1
0xfd5ff0ef880a4701
]: 540
|
1
2
3
4
5
6
7
8
9
10
| ubuntu@ubuntu:~$ sudo bpftrace -e 'uprobe:/home/ubuntu/busy:inc { @[ustack] = count(); }'
Attaching 1 probe...
^C
@[
inc+0
main+22
0x1
0xfd5ff0ef880a4701
]: 59460
|
1
2
3
4
5
6
7
| ubuntu@ubuntu:~$ sudo killsnoop.bt
Attaching 3 probes...
Tracing kill() signals... Hit Ctrl-C to end.
TIME PID COMM SIG TPID RESULT
23:19:19 300 systemd-journal 0 345 0
23:19:19 300 systemd-journal 0 601 0
23:19:19 300 systemd-journal 0 446 -1
|