bpftrace

投稿者: | 2024年2月25日

参考文献

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...

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です