x86_64架构下BPFtrace提示rax无效,咨询有效寄存器名称
x86_64架构下bpftrace支持的寄存器及问题修复
一、x86_64架构bpftrace支持的寄存器列表
在x86_64架构中,bpftrace支持以下小写形式的寄存器名称:
- 通用寄存器:
rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp,r8,r9,r10,r11,r12,r13,r14,r15 - 指令指针寄存器:
rip - 标志寄存器:
rflags
二、报错原因及修复方案
你遇到的rax is not a valid register on this architecture (x86_64)报错,主要有两个原因:
- 探针点与寄存器访问方式不匹配:
x64_sys_call并非标准kprobe探针点,且在kprobe上下文里,寄存器需通过regs->寄存器名的方式访问,而非reg("寄存器名")。 - 若误写为大写寄存器名(如
RAX),也会触发该错误。
修正后的命令示例
方案1:使用更可靠的tracepoint探针(推荐)
tracepoint上下文可直接通过args->id获取系统调用号,无需操作寄存器:
bpftrace -e 'tracepoint:syscalls:sys_enter_* /pid == cpid/ { printf("SYS %d\n%s\n----\n%s\n\n", args->id, kstack, ustack) }' -c /bin/ls
方案2:使用标准kprobe探针
针对x86_64的系统调用入口探针__x64_sys_*,通过regs->rax获取系统调用号:
bpftrace -e 'kprobe:__x64_sys_* /pid == cpid/ { printf("SYS %lx\n%s\n----\n%s\n\n", regs->rax, kstack, ustack) }' -c /bin/ls
补充说明
若仍存在寄存器识别问题,建议升级bpftrace到最新稳定版本,新版本对寄存器访问的兼容性和稳定性更好。
内容的提问来源于stack exchange,提问作者joachim Bose
相关产品推荐
相关产品推荐

