Linux�ɂ����闘�p���}���ɑ����Ă���uBerkeley Packet Filter�iBPF�j�v�ɂ��āA��b���牞�p�܂ŕ��L���Љ��A�ځB����́A�ubpftrace�v�ɂ��g���[�V���O�ɂ��āB
���̋L���͉������ł��B����o�^�i�����j����ƑS�Ă������������܂��B
�@Linux�ɂ����闘�p���}���ɑ����Ă���uBerkeley Packet Filter�iBPF�j�v�ɂ��āA��b���牞�p�܂ŕ��L���Љ��A�ځuBerkeley Packet Filter�iBPF�j�����v�B�O����BPF�ɂ��g���[�V���O�ɂ��āA�����܂��Ȏd�g�݂�T�v��������܂����B����́ABPF�ɂ���\�I�ȃg���[�V���O�c�[���ubpftrace�v�ɂ��āA��̓I�ɂǂ̂悤�Ȃ��Ƃ��ł���̂����Љ�܂��B�܂��Abpftrace�̒��ӓ_�╪����ɂ����_�ɂ��Ă��܂Ƃ߂܂��B
�@bpftrace��BPF�𗘗p�����g���[�V���O�c�[���̈�ł��B��\�I��BPF�̃��C�u�����ł���uBCC�iBPF Compiler Collection�j�v�Ɠ������A���݂́uiovisor�v���Ǘ����Ă��܂��BBCC�Ɣ�r����ƁAbpftrace�̓g���[�X�����ɓ������A���ȒP�ɗ��p�ł���悤�ɂȂ��Ă���Ƃ�����ł��傤�B
�@bpftrace�ɂ͉��L�̂悤�ȓ���������܂��B
�@BPF��p���ĉ����g���[�V���O�������ꍇ�A��Ԃ��E�߂̃c�[���ł��B
�@bpftrace���C���X�g�[�������v�ȕ��@���Љ�܂��B�O��Ƃ��āA��ʂ�Linux 4.9�ȏ��BPF���L�������ꂽ�J�[�l�����K�v�ł��BUbuntu 18.04+�AFedora 31+�AREHL�iRed Hat Enterprise Linux�j 8�AREHL 7�iBPF�@�\���o�b�N�|�[�g����Ă���j�Ȃǂŗ��p�ł��܂��B����bpftrace���������߂ɐV�K��OS�����\�z����ꍇ�́ABTF�̃T�|�[�g������Fedora 32�����E�߂ł��B
�@�����̃p�b�P�[�W�}�l�W���[��bpftrace����舵���Ă��܂��B
sudo snap install bpftrace --devmode sudo snap connect bpftrace:system-trace
�@Ubuntu 20.04�ł�apt������C���X�g�[���ł��܂����Asnap�ł̕����p�b�P�[�W�̍X�V�p�x�������ł��B
sudo dnf install -y bpftrace
�@�p�b�P�[�W�}�l�W���[�ɑ��݂���bpftrace�́A�ꍇ�ɂ���Ă̓o�[�W�������Â����Ƃ�����܂��B�����o�O�Ǝv���鋓���ɑ��������ꍇ�́A�ȉ��̕��@�ōŐV�ł������Ă݂Ă��������Bbpftrace�͌��݊����ɊJ������Ă���̂ŁA�o�O���C������Ă���\��������܂��B
�@GitHub Actions��embedded build����A�ŐV�̃r���h����肷�邱�Ƃ��\�ł��B
�@quay.io��bpftrace��Docker�C���[�W������܂��B����Docker�C���[�W�ɂ͍ŐV�ł�bpftrace���܂܂�Ă��܂��B����Docker�C���[�W�́A�ȉ��̂悤�ɃJ�[�l���\�[�X��debugfs��K�ɃR���e�i�Ƀ}�E���g�������privilege�ȃR���e�i�Ƃ��ė��p���܂��B
$ docker run -ti -v /usr/src:/usr/src:ro \ -v /lib/modules/:/lib/modules:ro \ -v /sys/kernel/debug/:/sys/kernel/debug:rw \ --net=host --pid=host --privileged \ quay.io/iovisor/bpftrace:latest
�@�R���e�i����/usr/bin/bpftrace��bpftrace������܂��B�܂�/usr/local/bin/�ȉ���bpftrace�̃X�N���v�g���C���X�g�[������Ă��܂��B
�@bpftrace�̍ŐV�@�\�A����BTF�Ɋւ���@�\�𗘗p����ꍇ�́A������BCC�Alibbpf��bpftrace���r���h����K�v������܂��B�ڍׂɂ��ẮuINSTALL.md�v���Q�Ƃ��Ă��������B
�@bpftrace�̎��s������Ă݂܂��傤�B
�@�܂��ubpftrace --info�v��bpftrace���T�|�[�g���Ă���@�\����сA�J�[�l�����T�|�[�g���Ă���BPF�̋@�\�̗L�����m�F�ł��܂��B�Ȃ��A���̃R�}���h�����s�ł��Ȃ��ꍇ�Abpftrace�̃o�[�W�������Â��ł��B�܂��Abpftrace�̎��s�ɂ�root�����iCAP_SYS_ADMIN�j���K�v�ł��B
$ bpftrace --info System OS: Linux 5.7.0+ #2 SMP Mon Jun 1 12:50:01 JST 2020 Arch: x86_64 Build version: v0.10.0-163-gdc96 LLVM: 10 foreach_sym: yes unsafe uprobe: no bfd: yes bpf_attach_kfunc: yes Kernel helpers probe_read: yes probe_read_str: yes probe_read_user: yes probe_read_user_str: yes probe_read_kernel: yes probe_read_kernel_str: yes get_current_cgroup_id: yes send_signal: yes override_return: yes [...]
�@����ł�bpftrace���g���Ă݂܂��傤�B
$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s\n"�Astr(args->filename)); }' Attaching 1 probe... /proc/15720/cmdline [...]
�@����́uopenat(2)�v�V�X�e���R�[�������s���ꂽ�ۂɁA�����̃t�@�C������\������bpftrace�̃X�N���v�g�ł��B�utracepoint:syscalls:sys_enter_openat�v���g���[�X�Ώۂ̃C�x���g���i�u�v���[�u�v�Ƃ����܂��j�A���̌��{ }�ň͂܂ꂽ�������A���̃C�x���g�����������ۂɎ��s����A�N�V�����i��BPF�v���O�����j�ł��B
�@BCC��BPF�v���O�������쐬����ꍇ�́y1�zBPF�v���O�����{�̂ƁA�y2�z�g���[�V���O���ʂ�\�����邽�߂̃v���O������ʁX�ɍ쐬����K�v������܂����Bbpftrace�̏ꍇ�́A���̕�����I�ɋL�q�ł���悤�ɂȂ��Ă��܂��B�����I�ɂ�bpftrace�̓X�N���v�g�����LLVM IR���o�R����BPF�v���O�����ɃR���p�C��������A������J�[�l���Ƀ��[�h���܂��B���̌�bpftrace�́ABPF�v���O�����̏o�͂��Ď����A�K�v�ɉ����Č��ʂ�\�����܂��B
�@bpftrace���g���[�X�ł���v���[�u�́ubpftrace -l�v�ŕ\���ł��܂��B
$ bpftrace -l software:bpf-output: software:context-switches: software:cpu-clock: [...]
�@�������A���̂܂܂��Ɛ������߂���̂ŁA�ȉ��̂悤�Ɍ��肵�Č�������Ƃ����ł��傤�B
$ bpftrace -l 'kprobe:vfs_*' // vfs_����͂��܂�kprobe�Ńg���[�X�\�Ȋ���\�� $ bpftrace -l 'tracepoint:syscalls:*' // syscall��tracepoint�݂̂�\��
�@bpftrace�͈ȉ��̃v���[�u�ɑΉ����Ă��܂��B�e��v���[�u�̏ڍׂ��O���̋L�����Q�Ƃ��Ă��������B
�v���[�u�^�C�v | �T�v | BPF�v���O�����^�C�v |
---|---|---|
tracepoints | tracepiont | `BPF_PROG_TYPE_TRACEPOINT` |
kprobe | �J�[�l�����g���[�V���O | `BPF_PROG_TYPE_KPROBE` |
kretprobe | ����ireturn�̃g���[�V���O�j | `BPF_PROG_TYPE_KPROBE` |
uprobe | ���[�U�[�v���O�����g���[�V���O | `BPF_PROG_TYPE_KPROBE` |
uretrobe | ����ireturn�̃g���[�V���O�j | `BPF_PROG_TYPE_KPROBE` |
usdt | USDT | `BPF_PROG_TYPE_KPROBE` |
software | perf software event | `BPF_PROG_TYPE_PERF_EVENT` |
hardware | perf hardware event | `BPF_PROG_TYPE_PERF_EVENT` |
profile | ��莞�ԊԊu�ŃC�x���g������ | `BPF_PROG_TYPE_PERF_EVENT` |
interval | ��莞�ԊԊu�ŃC�x���g������ | `BPF_PROG_TYPE_PERF_EVENT` |
kfunc | BPF trampoline�ɂ��g���[�X | `BPF_PROG_TYPE_TRACING` |
kretfunc | ���� �ireturn�̃g���[�V���O�j | `BPF_PROG_TYPE_TRACING` |
BEGIN | �v���O�����J�n���Ɏ��s����� | �@ |
END | �v���O�����I�����Ɏ��s����� | �@ |
�@�܂��A�u-v�v�I�v�V�������ꏏ�ɕt����ƁA�v���[�u�̏ڍׂȏ�����܂��Btracepiont�̏ꍇ�̓A�N�Z�X�\�Ȉ����̏�����܂��B
�@���L��bpftrace�v���O�����ł́A�uargs->filename�v�Ńt�@�C�����ɃA�N�Z�X���Ă��܂����B
$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s\n"�Astr(args->filename)); }' Attaching 1 probe... /proc/15720/cmdline [...]
�@���́ufilename�v�͉��L�ŕ\������Ă���tracepoint�̃f�[�^�ɑΉ����܂��B
$ bpftrace -lv 'tracepoint:syscalls:sys_enter_openat' tracepoint:syscalls:sys_enter_openat int __syscall_nr; int dfd; const char * filename; int flags; umode_t mode;
�@��ɏЉ��bpftrace�v���O�����ł́uprintf()�v�𗘗p���āA�t�@�C�������o�͂��Ă��܂����B��\�I�ȃA�N�V�����̒��g�Ƃ��ẮA�uprintf()�v�ɂ��o�͂̑��ɁABPF�}�b�v�𗘗p�����C�x���g�̌v��������܂��B�Ⴆ�A�ȉ��̃v���O�����́Abpftrtace���s����mCtrl�n�{�mC�n�L�[�Ŏ��s���I������܂ł́uopenat(2)�v�V�X�e���R�[���̔������v�����܂��B
$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @ = count(); }' ^C @: 929
�@�����ŁA�u@�v��BPF�}�b�v���Ӗ����܂��BBPF�}�b�v�̓O���[�o���ȃf�[�^�\���Ƃ��ė��p�ł��܂��B�ucount()�v�̓}�b�v�ɑ�����ʂȊ��ŁA���̃v���[�u���Ăꂽ�����}�b�v�ɕێ����܂��B���ʂƂ��č���̏ꍇ�́uopenat(2)�v���Ăꂽ���L�^����܂��Bbpftrace�̓v���O�����I�����Ɏ����Ń}�b�v�̒��g��\�����܂��B
�@�ȉ��̂悤�ɂ���ƁA�uoepnat(2)�v�̈����̃t�@�C������"/etc/passwd"�ł��������̂̂v�����܂��B
$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { if (str(args->filename) == "/etc/passwd") { @ = count(); }}' @: 15
�@�t�@�C�����ʂŏW�v���邱�Ƃ��\�ł��B
$ $bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @[str(args->filename)] = count(); }' Attaching 1 probe... ^C @[/proc/16288/cmdline]: 1 [...]
�@���̂悤�ɁAbpftrace�ł͂�������Ƀ}�b�`�����C�x���g�̏W�v�⒊�o���ȒP�ɍs���܂��B���̍ۃ��[�U�[��BPF�ɂ��Ă͂قƂ�Ljӎ�����K�v�͂���܂���B����Ńg���[�V���O�v���O������BPF�v���O�����ɃR���p�C������Averifier�ň��S���������ꂽ�̂��ɃJ�[�l�����œ��삵�܂��B���ʂƂ��āA��I�[�o�[�w�b�h�Ńg���[�V���O�����������ł��܂��B
�@kprobe�𗘗p����ƁA�J�[�l�����̊��i�u/proc/kallsyms�v�ŕ\�������قƂ�ǂ̊��j���g���[�X���邱�Ƃ��ł��܂��B�ȉ��́uvfs_open()�v�����Ăꂽ�ۂɁA���̈�������t�@�C������\�����܂��B
$ bpftrace -e 'kprobe:vfs_open { $filename = str(((struct path *)arg0)->dentry->d_name.name); printf("%s\n"�A$filename); }' --include linux/fs.h Attaching 1 probe... cmdline [...]
�@kprobe�v���[�u�̒��ł́A�uarg0�v�uarg1�v�c�c�Ŋ��̈����ɃA�N�Z�X�ł��܂��B���̂Ƃ��A�����I�Ɉ����������ŃL���X�g�i����̏ꍇ�́u(struct path*)�v�j����K�v������܂��B�܂��A�ustruct path�v�̒�`���擾���邽�߂Ɂulinux/fs.h�v���C���N���[�h���Ă��܂��B��q��kfunc�𗘗p����ƁA���̋L�q���s�v�ɂȂ�܂��B
�@kretprobe�̓J�[�l������return����ۂɃC�x���g���������܂��B�Ȃ��Akretprobe�͂��̐���ɂ��A���̈����ɒ��ڃA�N�Z�X���邱�Ƃ͂ł��܂���Bkretprobe������̈����ɃA�N�Z�X�������ꍇ�́A���O��kprobe�̃A�N�V�����œK����BPF�}�b�v�Ɉ�����ۑ�����K�v������܂��B
�@uprobe�^uretprobe�𗘗p���āA���[�U�[�v���O�������g���[�X���邱�Ƃ��ł��܂��B�Ⴆ�A�ȉ��̊ȒP�ȃv���O�������l���܂��B
#include <stdio.h> int f(int a�Aint b){ return a + b; } int main(){ printf("%d\n"�Af(1,2)); }
�@���̃v���O�������R���p�C��������A�u-l�v�I�v�V�����Ńg���[�X�\�Ȋ����擾�ł��܂��B
$ bpftrace -lv "uprobe:./a.out" BTF: using data from /sys/kernel/btf/vmlinux uprobe:./a.out:__do_global_dtors_aux uprobe:./a.out:__libc_csu_fini uprobe:./a.out:__libc_csu_init uprobe:./a.out:_fini uprobe:./a.out:_init uprobe:./a.out:_start uprobe:./a.out:deregister_tm_clones uprobe:./a.out:f uprobe:./a.out:frame_dummy uprobe:./a.out:main uprobe:./a.out:register_tm_clones
�@�ȉ��̂悤�ɂ��Ċ��uf�v���Ăꂽ�ۂɁA���̂Ƃ��̈������o�͂ł��܂��B
$ bpftrace -e 'uprobe:./a.out:f { printf("%d�A%d\n"�Aarg0�Aarg1); }' Attaching 1 probe... 1�A2
�@uprobe�͋��L���C�u�����̊��ɑ��Ă����p�\�ł��B�Ⴆ�Ή��L�́A�ulibc�v�́unanosleep�v�����Ă��v���Z�X�����ƂɏW�v���܂��B
$ bpftrace -e 'u:/lib/x86_64-linux-gnu/libc.so.6:*nanosleep* { @[comm] = count(); }' Attaching 7 probes... ^C @[sleep]: 3
�@�Ȃ��Auprobe�ł̓J�[�l���̋@�\�̐���ɂ�蕂�������_���W�X�^�ɃA�N�Z�X���邱�Ƃ͂ł��܂���B
�@USDT�̓��[�U�[�v���O�������Ŗ����I�Ƀv���[�u���`������@�ŁA���Ƃ��Ƃ́uDTrace�v��uSystemTap�v�ŗ��p����Ă������̂ł��BUSDT���`������@�͊������܂����A�ȉ��Ɂusys/sdt.h�v�𗘗p�����������܂��B
#include <stdio.h> #include <sys/sdt.h> int f(int a�Aint b){ DTRACE_PROBE2(test�Aprobe�Aa�Ab); return a + b; } int main(){ printf("%d\n"�Af(1,2)); }
�@�����ŁuDTRACE_PROBE2(...)�v��USDT�̒�`�ł��B�Ȃ��A�uDTRACE�v�Ƃ������O���t���Ă��܂����A����͂��Ƃ���DTrace�Ŏg���Ă����f�[�^�`���𗘗p���Ă��邩��ł����āAbpftrace�����s����ۂɉ���DTrace�̋@�\�𗘗p���Ă���킯�ł͂���܂���B
�@���̃v���O�������R���p�C��������A�u-l�v�I�v�V�����ňȉ��̂悤�ɒ�`����USDT���m�F�ł��܂��B
$ bpftrace -lv "usdt:./a.out" BTF: using data from /sys/kernel/btf/vmlinux usdt:./a.out:test:probe
�@USDT�̏���ELF�̓���Z�N�V�����Ɋi�[����Ă��܂��B����́ureadelf�v�R�}���h�ɂ���Ċm�F�ł��܂��B
$ readelf -n ./a.out [...] Displaying notes found in: .note.stapsdt Owner Data size Description stapsdt 0x0000003b NT_STAPSDT (SystemTap probe descriptors) Provider: test Name: probe Location: 0x0000000000000654, Base: 0x0000000000000718, Semaphore: 0x0000000000000000 Arguments: -4@-4(%rbp) -4@-8(%rbp)
�@bpftrace����USDT�͈ȉ��̂悤�ɗ��p���܂��B�uarg0�v�uarg1�v�c�c��USDT�ɗ^���������ɃA�N�Z�X�ł��܂��B
$ bpftrace -e 'usdt:./a.out:test:probe { printf("%d�A%d\n"�Aarg0�Aarg1); }' Attaching 1 probe... 1�A2
�@software�^hardware�v���[�u�𗘗p����ƁA�w�肵��perf event����������������ۂɃA�N�V���������s���邱�Ƃ��ł��܂��B
$ bpftrace -e 'software:faults:100 { @[comm] = count(); }' Attaching 1 probe... ^C @[git]: 1 @[tr]: 1 @[getent]: 1
�@profile�v���[�u�𗘗p����ƁACPU���ƂɈ��Ԋu�ŃC�x���g���������܂��B����͎�Ɂukstack�v�uustack�v�Ƃ������X�^�b�N�g���[�X���擾����@�\�ƍ��킹�ăv���t�@�C�����O�ɗ��p����܂��B�ȉ��̃v���O�����́A99hz�ŃJ�[�l���X�^�b�N���擾���A���̃X�^�b�N�g���[�X���o���������L�^���܂��B
$ bpftrace -e 'profile:hz:99 { @[kstack] = count(); }' Attaching 1 probe... ^C @[ native_safe_halt+23 __sched_text_end+38 arch_cpu_idle+21 default_idle_call+35 do_idle+462 cpu_startup_entry+29 rest_init+174 arch_call_rest_init+14 start_kernel+1435 x86_64_start_reservations+36 x86_64_start_kernel+116 secondary_startup_64+164 ]: 98 [...]
�@interval�͈��Ԋu�ŃC�x���g���������܂��Bprofile�Ǝ��Ă��܂����A�C�x���g����������̂�1��CPU�݂̂ł��B��Ɉȉ��̂悤�ɑ��̃v���[�u�Ƒg�ݍ��킹�邱�Ƃ�ړI�ɗ��p����܂��B
// 1�b���bpftrace�̎��s���I�� i:1:s { printf("count = %d\n," @); // 1�b���bpftrace�̎��s���I�� i:1:s { exit(); }
�@kfunc�^kretfunc��Linux 5.5���瓱�����ꂽ�ABTF�𗘗p�����g���[�X���@�ł��B�g������kprobe�Ƃقړ��l�ł����ABTF�𗘗p���邱�Ƃɂ��Akprobe�ƈ���ăJ�[�l�������̈����̌^��BPF�v���O�����������ŔF�����Ă���܂��B��L��kprobe�̏�����kfunc�ŋL�q����ƁA���L�̂悤�ɂȂ�܂��Bkprobe�ƈႢ�A�����I�Ɉ������L���X�g����K�v������܂���B
$ bpftrace -e 'kfunc:vfs_open { $filename = str(args->path->dentry->d_name.name); printf("%s\n"�A$filename); }' Attaching 1 probe... cmdline
�@BTF�ɂ��Ă͏ڂ����͎���������܂��B
�@���ڂ���bpftrace���w�Ԃɂ́A�܂��������`���[�g���A�����Q�Ƃ��邱�Ƃ������߂��܂��B�ٖ�����{���������̂ŁA�Q�l�ɂ��Ă��������B
�@�܂��A�������|�W�g���́utools�v��bpftrace�̃X�N���v�g�������܂܂�Ă��܂��B���p�I�ȃg���[�V���O������ꍇ�͂܂������̃c�[������ɁA�K�v�ɉ����ĉ��ǂ������Ă����̂������Ǝv���܂��B���ڂ�������̋@�\�Ɋւ��Ă����t�@�����X�K�C�h���Q�Ƃ��Ă��������B
�@�p�t�H�[�}���X����Ɋւ���ڂ���������u�ǂ�ȂƂ��ɂǂ̃C�x���g���g���[�X���ׂ����v�Ɋւ��ẮA���L�̕������Q�l�ɂȂ�܂��B���ɁA�uBPF Performance Tools�v�ɂ�bpftrace��p�����g���[�X�c�[���̗Ⴊ�����܂܂�Ă��܂��B
�@�Ō�ɁAbpftrace�̕�����ɂ����_��͂܂�₷���_���܂Ƃ߂܂��B�g���u���V���[�g�̎Q�l�ɂ��Ă��������B�����ŎQ�Ƃ��Ă���bpftrace�̓o�[�W����0.10�ł��B�Ȃ�bpftrace�́A�܂��o�[�W����1.0�ɂȂ��Ă��炸�A�����ɏ����Ă��邱�Ƃ�����ς��\�����\������܂��B
�@bpftrace��C���ꃉ�C�N�ȕ��@�ł����A�����܂œƎ��̕��@�������A�\����͂����O�̂��̂𗘗p���Ă��܂��B����͍\����͂�Clang�𗘗p����BCC�ƈقȂ�܂��B�]���āABCC�̂悤��C����̕��@���g����Ǝv���ăv���O�������쐬����Ɖ��X�ɂ��ăG���[�ɂȂ�܂��B
�@�Ȃ��Abpftrace�͍\���̂̉�͏�����Clang�𗘗p���Ă��܂��B�������A�����܂Ń��C���̍\����͂�flex�^bison�ŏ������Ă��܂��B
�@bpftrace�̃}�b�v���icount()�Ahist()�Alhist()�Amin()�Amax()�Asum()�Aavg()�Astats()�j�́A�ΏۂƂȂ�}�b�v�̒l���X�V���܂��B�Ⴆ�Ή��L��sum()���́A
@ = sum($value);
�����I�ɂ́A���̂悤�Ȗ��ߗ�ɕϊ�����܂��B
$sum = @; // bpf_map_lookup_elem() $sum += $value; @ = $sum; // bpf_map_update_elem()
�@bpftrace�̊��̂����Aprintf()�Aprint()�Atime()�Aclear()�Azero()�Asystem()�Ajoin()�Acat()�Aexit()�͔����ł��B�����̏�����BPF�v���O�����������ł͊������܂���Bbpftrace�̔����͉��L�̂悤�ɓ��삵�܂��B
�@�]���āA�����̎��s�ɂ̓��O������܂��B�����̏ꍇ����͖��ɂ͂Ȃ�܂��A�Ӑ}���Ȃ�����������N�����\��������܂��B�Ⴆ�A�ȉ��̃v���O�������l���܂��B
{ @ = 1; zero(@); printf("%d\n"�A@); }
�@�uzero()�v�̓}�b�v�̃G���g�����u0�v�ɂ�����ł����A���̃v���O�����́u1�v���o�͂��܂��B�Ȃ��Ȃ�uzero(@)�v�͔����ł���Aprintf()�����s�������_�iprintf()�������ł����ABPF�v���O������print���������perf buffer�ɏo�͂��܂��j�ł�zero()�̏����͊������Ă��Ȃ����߂ł��B���̗�̏ꍇ�ł�zero()�ł͂Ȃ�����0��������i@ = 0�B���̏ꍇbpf_map_update_elem()�j�Ŗ��͉����ł��܂��B
�@�������A�����ł͈�v�f���������Ă��܂��A�N���A�������}�b�v�̗v�f���Ƃɏ����K�v������܂��B
�@�Ȃ��Adelete()�͔����ł͂���܂���ibpf_map_delete_elem()�����s���܂��j�B
�@�uprintf(%s)�v�̈�����A�}�b�v�̃L�[��l�Ƃ��ĕ�����𗘗p�������ꍇ������܂��Bbpftrace�ŕ�������\��������@�͉��L��3�ł��B
�@�����Œ��ӂ��ׂ��_�́A�|�C���^��str()���𗘗p���Ė����I�ɕ�����ɕϊ�����K�v���������ŁAchar []�̍\���̂̃t�B�[���h�Ɋւ��Ă̓A�N�Z�X���Ɏ����ŕ�����ɕϊ������Ƃ������Ƃł��B
�@��̗��������ƁA�udo_sys_open()�v���̑�2�����́uconst char __user *filename�v�ŁA����̓|�C���^�Ȃ̂ŁA�t�@�C�����̕������ɂ�str()�𗘗p���܂��B����ŁAstruct task_struct��comm��char[16]�Ȃ̂ŁA�P���Ɂucurtask->comm�v�ƃA�N�Z�X���邾���ŕ��������܂��icurtask�̓J�[�l����current�ϐ��i���݂̃^�X�N��task struct�j��ێ�����r���g�C���ϐ��ł��j�Bstr()�𗘗p����K�v�͂���܂���i�Ȃ��Atask struct��comm�t�B�[���h�ɂ͐�p�̃r���g�C���ϐ�comm�Œ��ڃA�N�Z�X�ł��܂��j�B
�@�������bpftrace�̃X�^�b�N��ɕۑ�����܂��B�����I�ɂ͕�����͌Œ蒷�ň����Ă���A���̒����̓f�t�H���g��64�ł��B���̒l��BPFTRACE_STRLEN�ŕύX�ł��܂��BBPF�v���O�����̃X�^�b�N��512�o�C�g�����Ȃ����߁A�����̕�����������ꍇ�̓X�^�b�N�I�[�o�[�t���[�ŃG���[�ɂȂ邱�Ƃ�����܂��B���̂悤�ȏꍇ�͂���BPFTRACE_STRLEN�̒l�̕ύX�������Ă��������B��������Œ蒷�ň������R�́ABPF�}�b�v�̃L�[��l�̃T�C�Y���Œ�ł��邽�߂ł��B
�@�Ȃ�������Ɋւ��Ă̓C���f�b�N�X�ŃA�N�Z�X�ł��Ȃ��A�����������Z���ł��Ȃ��Ȃǂ̖�肪����A�������@�̕ύX���c�_����Ă��܂��B
�@�u#include�v�𗘗p����C�̃w�b�_���C���N���[�h���邱�Ƃ��ł��܂��B����͍\���̂̉�͂ɗ��p���܂��B�C���N���[�h�ɂ���`���ꂽ�\���̂͌�q�̃L���X�g�ŗ��p�ł��܂��B�Ȃ��A�w�b�_���C���N���[�h��������Ƃ����āA���̃w�b�_���Œ�`����Ă���C�����C�������g�p�ł���悤�ɂ͂Ȃ�܂���B
�@enum����`����Ă���t�@�C�����C���N���[�h����ƁA�v���O�����̒��ł���enum�l�𗘗p���邱�Ƃ��ł��܂��B
�@bpftrace�v���O�����ł́A�����l���\���̂ւ̃|�C���^�փL���X�g�\�ł��B
$a = (struct file*)$value;
�@�܂��A�����l�̃L���X�g���\�ł��B
$a = (uint16)$value;
�@�����^�Ƃ��ė��p�ł���̂�int8�Aint16�Aint32�Aint64�Auint8�Auint16�Auint32�Auint64�ł��B
�@����ȊO�̌^�ւ̃L���X�g�̓T�|�[�g����Ă��܂���B
�@bpftrace�ɂ�C����I�ȃ|�C���^���Z�̊T�O�͂���܂���B�|�C���^�l�͂����̐����l�Ƃ��Ĉ����܂��B�|�C���^���Z������ꍇ�́A�ȉ��̂悤�Ƀ|�C���^�T�C�Y�������I�t�Z�b�g����Z����K�v������܂��B
$a = $ptr+$index*8;
�@profile��interval�͋���perf��software event�ł���CPU�𗘗p���܂����Aprofile���S��CPU�ɑ��ăC�x���g��L���ɂ������ŁAinterval��CPU0�ɑ��Ă̂݃C�x���g��L�������܂��B
�@bpftrace�ł͈ȉ��̂悤�ȗ���ŏ������i�݂܂��B
0.bpftrace�v���O�����̃R���p�C��
1.BEGIN�v���[�u�̎��s
2.BPF�v���O�����̃A�^�b�`
3.�����̊J�n�B�mCtrl�n�{�mC�n�L�[��uexit()�v�ŏI��
4.END�v���[�u�̎��s
5.perf buffer�����i�c���������̎��s�j
6.BPF�v���O�����̃f�^�b�`
7.�}�b�v�̒l�̏o��
�@���ݎ��s����bpftrace�v���O���������p���Ă���}�b�v�𑀍삵�������Ƃ�����܂��Bbpftool�𗘗p����ƃR�}���h���C������}�b�v���e�̊m�F��X�V���ł��܂��B
�@�Ȃ��Abpftrace�v���O��������Abpftrace���s�ȑO���瑶�݂���}�b�v���Q�Ƃ�����@�́A���݂͑��݂��܂���Bbpftrace�����p����}�b�v��bpftrace�v���O�����R���p�C�����ɍ쐬����Abpftrace�I�����ɍ폜����܂��B
�@�O�q�̒ʂ�Abpftrace�͌��݃o�[�W����1.0�Ɍ����Ċ����ɊJ�����ł��B�����o�O�̂悤�ȋ����ɑ��������ꍇ�A�ŐV�ł������Ă݂�Ƃ��ꂪ�C������Ă���\��������܂��B�ŐV�łł��o�O�����݂��Ă���ꍇ�́A����GitHub��issue�ɕ��Ă݂Ă��������B
�@�����BPF��p������\�I�ȃg���[�V���O�c�[���ł���bpftrace�̎g�����ƁA���̎d�g�݂ɂ��Đ������܂����B����́ABPF�ɂ��g���[�V���O���x�����邽�߂ɓ������ꂽ�V�@�\BTF�ƁA���̉��p����Љ�܂��B
������w ��w�@ ��H�w�n������ ���m�ے�
�I�y���[�e�B���O�V�X�e���≼�z���Z�p�̌����ɏ]���B
Copyright © ITmedia, Inc. All Rights Reserved.