如何在 kprobe 中使用寄存器?
How to use registers in kprobe?
来自 kprobe document:
echo 'p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)' > /sys/kernel/debug/tracing/kprobe_events
据我了解,在X86_64
平台上,参数应该被传递到寄存器中(请参考X86_64 syscalls)。所以我认为添加探针应该是这样的:
echo 'p:myprobe do_sys_open dfd=%rdi filename=%rsi flags=%rdx mode=%rcx' > /sys/kernel/debug/tracing/kprobe_events
但是执行上面的语句,bash
报错:
-bash: echo: write error: Invalid argument
所以我的问题是:如何在kprobe
中使用寄存器?哪些寄存器有效?
在与 kprobe
维护者讨论后,我得到了答案:
ftrace-kprobe
接口不接受像“rax
”这样的位宽前缀,而是接受“ax
”。位宽由体系结构自动选择。因此,请从所有参数中删除“r
”。如果您想访问 eax
或 ax
,您可以使用类型转换,例如 %ax:u32
。
来自 kprobe document:
echo 'p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)' > /sys/kernel/debug/tracing/kprobe_events
据我了解,在X86_64
平台上,参数应该被传递到寄存器中(请参考X86_64 syscalls)。所以我认为添加探针应该是这样的:
echo 'p:myprobe do_sys_open dfd=%rdi filename=%rsi flags=%rdx mode=%rcx' > /sys/kernel/debug/tracing/kprobe_events
但是执行上面的语句,bash
报错:
-bash: echo: write error: Invalid argument
所以我的问题是:如何在kprobe
中使用寄存器?哪些寄存器有效?
在与 kprobe
维护者讨论后,我得到了答案:
ftrace-kprobe
接口不接受像“rax
”这样的位宽前缀,而是接受“ax
”。位宽由体系结构自动选择。因此,请从所有参数中删除“r
”。如果您想访问 eax
或 ax
,您可以使用类型转换,例如 %ax:u32
。