目次
参考文献
bpftrace/docs/reference_guide.md at master · bpftrace/bpftrace · GitHub
bpftrace Cheat Sheet (brendangregg.com)
インストール
root@ubuntu3:/sys/kernel/debug/tracing# apt install bpftrace
root@ubuntu3:/sys/kernel/debug/tracing# bpftrace -l
(tracepointのリストが表示される。)
カーネルデバッグ
カーネルの関数名でprobe
root@ubuntu3:/sys/kernel/debug/tracing# bpftrace -e 'kprobe:fuse_perform_write { printf("fuse_perform_write\n"); }'
Attaching 1 probe...
fuse_perform_write
fuse_perform_write
カーネル関数のコールスタックを出力
root@ubuntu3:/sys/kernel/debug/tracing# bpftrace -e 'kprobe:fuse_perform_write { printf("%s", kstack()) }'
Attaching 1 probe...
fuse_perform_write+1
fuse_file_write_iter+99
new_sync_write+279
カーネル関数名でカーネルスタックをカウント
root@ubuntu3:/sys/kernel/debug/tracing# bpftrace -e 'kprobe:fuse_perform_write { @[kstack]=count(); }'
Attaching 1 probe…
^C
@[
fuse_perform_write+1
fuse_file_write_iter+99
new_sync_write+279
vfs_write+393
ksys_write+103
__x64_sys_write+26
do_syscall_64+92
entry_SYSCALL_64_after_hwframe+97
]: 10
ユーザ空間デバッグ
バイナリのuprobe一覧を取得
root@ubuntu3:/home/takayuki/repos/libfuse/build# sudo bpftrace -l 'uprobe:/home/takayuki/repos/libfuse/build/example/passthrough_ll'
uprobe:/home/takayuki/repos/libfuse/build/example/passthrough_ll:lo_destroy
uprobe:/home/takayuki/repos/libfuse/build/example/passthrough_ll:lo_release
uprobe:/home/takayuki/repos/libfuse/build/example/passthrough_ll:lo_copy_file_range
uprobe:/home/takayuki/repos/libfuse/build/example/passthrough_ll:lo_forget_one
バイナリが動的リンクするライブラリのuprobe一覧を取得
root@ubuntu3:/home/takayuki/repos/libfuse/build# ldd example/passthrough_ll
linux-vdso.so.1 (0x00007fffc1dcf000)
libfuse3.so.3 => /home/takayuki/repos/libfuse/build/example/../lib/libfuse3.so.3 (0x00007f690fef9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f690fec5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f690fcd3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f690fccd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f690ff47000)
root@ubuntu3:/home/takayuki/repos/libfuse/build# sudo bpftrace -l 'uprobe:/home/takayuki/repos/libfuse/build/example/../lib/libfuse3.so.3'
uprobe:/home/takayuki/repos/libfuse/build/example/../lib/libfuse3.so.3:fuse_loop_cfg_create
uprobe:/home/takayuki/repos/libfuse/build/example/../lib/libfuse3.so.3:fuse_reply_write
uprobe:/home/takayuki/repos/libfuse/build/example/../lib/libfuse3.so.3:fuse_req_userdata
ライブラリ関数のコールスタック出力(失敗、、、、)
root@ubuntu3:/home/takayuki/repos/libfuse/build# ps ax|grep fuse
1660 ? Sl 0:00 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes
9865 ? Ssl 0:00 ./example/passthrough_ll /mnt/fuse
9933 pts/3 S+ 0:00 grep --color=auto fuse
root@ubuntu3:/home/takayuki/repos/libfuse/build# sudo bpftrace -p 9865 -e 'use3.so.3:fuse_req_interrupted
> u^Cobe:/home/takayuki/repos/libfuse/build/example/../lib/libf
root@ubuntu3:/home/takayuki/repos/libfuse/build# sudo bpftrace -p 9865 -e 'uprobe:/home/takayuki/repos/libfuse/build/example/../lib/libfuse3.so.3:req_fuse_prepare { printf("%s", ustack()) }'
Attaching 1 probe...