有時候想要知道Linux系統(tǒng)中哪個進程打開了某個文件,你會想到使用審計工具,或者自己寫一個kprobe模塊跟蹤do_sys_open函數(shù)。
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)不需要這么麻煩,不管你在哪個架構平臺上工作,只需使用echo 和 cat命令執(zhí)行同樣的操作就能辦到(內核會自動創(chuàng)建kprobe):
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架構獲取函數(shù)參數(shù)必須使用架構相關的寄存器 (比如在x86_64獲取第二個函數(shù)參數(shù)可以用%si, 在riscv上使用%a1),其中對于riscv架構,maintainer已經接受了我的patch,很快就能合入Linux主線支持$argN。
然后任意cat一下,比如/open.c文件,再從ftrace環(huán)形隊列緩沖區(qū)就能讀到是進程號28257(cat)打開了什么文件。
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
cat ./trace
cat-28271 [003] .... 730253.982115: p_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的功能與實現(xiàn) ,歡迎掃碼下方的二維碼訂閱《Linux內核tracers的實現(xiàn)原理與應用》(目前已收到很多學員的好評:) )

---end---