Linux内核进程创建跟踪方法
Linux内核进程创建trace钩子
在 Linux 内核中跟踪进程创建事件有多种方法,以下是几种常用的技术方案和实现思路:
一、使用 Tracepoints(推荐)
内核已内置 sched_process_fork
tracepoint,可捕获进程创建事件。
1. 查看可用 tracepoints
1 | cat /sys/kernel/debug/tracing/available_events | grep sched_process_fork |
2. 通过 perf
工具快速测试
1 | perf record -e sched:sched_process_fork -a |
3. 内核模块示例代码
1 |
|
二、使用 kprobes(动态Hook)
当需要更底层的跟踪时,可以 Hook do_fork
(旧内核)或 kernel_clone
(新内核)等函数。
内核模块示例
1 |
|
三、使用 eBPF(现代方案)
通过 eBPF 程序安全地附加到 tracepoint 或 kprobes。
1. 使用 tracepoint
的 eBPF 示例(需要 libbpf)
1 | // 使用 SEC 宏附加到 tracepoint |
2. 使用 kprobe
的 eBPF 示例
1 | SEC("kprobe/do_fork") |
四、其他方法
SystemTap:
1
stap -e 'probe kernel.function("do_fork") { printf("fork by %s(%d)\n", execname(), pid()) }'
Ftrace:
1
2echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_fork/enable
cat /sys/kernel/debug/tracing/trace_pipe
注意事项
内核版本差异:
- 进程创建函数在历史上经历过变化:
- Linux 4.2 之前:
do_fork
- Linux 5.4+:
kernel_clone
- Linux 4.2 之前:
- 使用前需确认目标内核符号。
- 进程创建函数在历史上经历过变化:
安全性:
- 内核模块需要 root 权限加载。
- eBPF 程序需要
CAP_BPF
权限(Linux 5.8+)。
性能影响:
- kprobes 在高频调用场景可能影响性能。
- eBPF 程序需通过验证器,安全性更高。
总结
- 简单监控:使用
perf
或ftrace
工具。 - 生产环境:eBPF + BCC/libbpf。
- 深度调试:内核模块 + tracepoints/kprobes。
根据具体需求选择合适方案。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!