Как вы обнаружили, bpftrace назначает тип u64
вашей переменной $tpid
. Тем не менее, в соответствии с форматом трассировки do c., args->pid
должен иметь тип pid_t
, или int
.
# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_kill/format
name: sys_enter_kill
ID: 185
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1;
field:int __syscall_nr; offset:8; size:4; signed:1;
field:pid_t pid; offset:16; size:8; signed:0;
field:int sig; offset:24; size:8; signed:0;
print fmt: "pid: 0x%08lx, sig: 0x%08lx", ((unsigned long)(REC->pid)), ((unsigned long)(REC->sig))
Функция bpftrace, которая назначает эту тип TracepointFormatParser::adjust_integer_types()
. Это изменение было введено коммитом 42ce08f
для решения проблемы # 124 .
Для приведенного выше описания точки трассировки bpftrace генерирует следующую структуру:
struct _tracepoint_syscalls_sys_enter_kill
{
unsigned short common_type;
unsigned char common_flags;
unsigned char common_preempt_count;
int common_pid;
int __syscall_nr;
u64 pid;
s64 sig;
};
Когда он, вероятно, должен генерировать:
struct _tracepoint_syscalls_sys_enter_kill
{
unsigned short common_type;
unsigned char common_flags;
unsigned char common_preempt_count;
int common_pid;
int __syscall_nr;
u32 pad1;
pid_t pid;
u32 pad2;
int sig;
};
bpftrace, похоже, смущен параметром size, который не соответствует типу в приведенном выше описании. Все аргументы системного вызова имеют размер 8 (по крайней мере на 64-битной версии), но это не означает, что используются все 8 байтов. Думаю, стоило бы открыть вопрос о bpftrace.