附加 kprobe 时,`do_sys_open` 与 `__x86_sys_open`
`do_sys_open` vs `__x86_sys_open` when attaching kprobe
我试过 运行 opensnoop.py 但使用
fnname_open='do_sys_open'
(我在其他 scripts 看到的)而不是
fnname_open = b.get_syscall_prefix().decode() + 'open'
# = '__x86_sys_open' on Ubuntu 18.04
但脚本随后停止打印文件名。造成差异的原因是什么?
使用attach_kprobe(event=fn)
时是fn
系统调用还是事件?
您是否按照 所述从 /proc/kallsyms
获得了可能的系统调用列表?
附加到 __x86_sys_open
的 BPF 程序如果附加到 do_sys_open
将不会有相同的结果,因为这两个函数没有相同的原型:
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode);
long sys_open(const char __user *filename, int flags, umode_t mode);
因此,例如,filename
参数不会存储在同一寄存器中,具体取决于您跟踪的函数。您还需要编辑 BPF 程序来修复此问题。
我试过 运行 opensnoop.py 但使用
fnname_open='do_sys_open'
(我在其他 scripts 看到的)而不是
fnname_open = b.get_syscall_prefix().decode() + 'open'
# = '__x86_sys_open' on Ubuntu 18.04
但脚本随后停止打印文件名。造成差异的原因是什么?
使用attach_kprobe(event=fn)
时是fn
系统调用还是事件?
您是否按照 /proc/kallsyms
获得了可能的系统调用列表?
附加到 __x86_sys_open
的 BPF 程序如果附加到 do_sys_open
将不会有相同的结果,因为这两个函数没有相同的原型:
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode);
long sys_open(const char __user *filename, int flags, umode_t mode);
因此,例如,filename
参数不会存储在同一寄存器中,具体取决于您跟踪的函数。您还需要编辑 BPF 程序来修复此问题。