kprobe_event小试牛刀(两分钟改变你对函数trace的观念)

2021年11月20日 阅读数:3
这篇文章主要向大家介绍kprobe_event小试牛刀(两分钟改变你对函数trace的观念),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

有时候想要知道Linux系统中哪一个进程打开了某个文件,你会想到使用审计工具,或者本身写一个kprobe模块跟踪do_sys_open函数。
javascript

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)

不须要这么麻烦,无论你在哪一个架构平台上工做,只需使用echo 和 cat命令执行一样的操做就能办到(内核会自动建立kprobe):java

cd /sys/kernel/debug/tracingecho 'p do_sys_open arg1=+0($arg2):string' > ./kprobe_eventsecho 1 > ./events/kprobes/p_do_sys_open_0/enable

以上的$argN屏蔽了各个cpu架构获取函数参数必须使用架构相关的寄存器 (好比在x86_64获取第二个函数参数能够用%si, 在riscv上使用%a1),其中对于riscv架构,maintainer已经接受了个人patch,很快就能合入Linux主线支持$argN。
ruby


而后任意cat一下,好比/open.c文件,再从ftrace环形队列缓冲区就能读到是进程号28257(cat)打开了什么文件。bash

cat /open.c微信

cat ./trace 架构

...cat-28257 [002] .... 730138.355766: p_do_sys_open_0: (do_sys_open+0x0/0x260) arg1="/open.c"


若是也想知道在打开文件时候的call trace:
函数

echo 1 > ./options/stacktrace工具

cat /open.c ui

cat ./tracespa

 cat-28271 [003] .... 730253.982115p_do_sys_open_0: (do_sys_open+0x0/0x260) arg1="/open.c" cat-28271 [003] .... 730253.982115: <stack trace> => do_sys_open => do_syscall_64 => entry_SYSCALL_64_after_hwframe


以上只是kprobe_event的小试牛刀,若是想了解更多关于ftrace的功能与实现 ,欢迎扫码下方的二维码订阅《Linux内核tracers的实现原理与应用》(目前已收到不少学员的好评:) )



---end---

本文分享自微信公众号 - 相遇Linux(LinuxJeff)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。