Linux-5.10.13 ftrace源码分析
Posted 全波形反演
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-5.10.13 ftrace源码分析相关的知识,希望对你有一定的参考价值。
1. 从set_ftrace_filter
讲起
/sys/kernel/debug/tracing/tracing_on
su
cd /sys/kernel/debug/tracing/
echo 1 > tracing_on
echo "schedule" > set_ftrace_filter
echo function_graph > current_tracer
cat trace
部分输出:
1) ! 66730.47 us | }
------------------------------------------
1) contain-2264 => contain-2147
------------------------------------------
1) ! 66717.12 us | } /* schedule */
1) 3.683 us | schedule();
1) | schedule() {
------------------------------------------
1) contain-2147 => contain-2175
------------------------------------------
那么以上流程在内核中都经历了什么呢?让我们细细道来。
2. echo schedule > set_ftrace_filter
在内核中kernel\trace\ftrace.c
代码有:
trace_create_file("set_ftrace_filter", 0644, parent,
ops, &ftrace_filter_fops);
看一下文件操作符ftrace_filter_fops
:
static const struct file_operations ftrace_filter_fops = {
.open = ftrace_filter_open,
.read = seq_read,
.write = ftrace_filter_write,
.llseek = tracing_lseek,
.release = ftrace_regex_release,
};
显然,这里对应ftrace_filter_write
。
2.1. ftrace_filter_write
函数
该函数很简单:
ssize_t /* echo schedule > set_ftrace_filter */
ftrace_filter_write(struct file *file, const char __user *ubuf,
size_t cnt, loff_t *ppos)
{
return ftrace_regex_write(file, ubuf, cnt, ppos, 1);
}
调用了ftrace_regex_write
,首先从打开的文件私有数据中获取struct ftrace_iterator
结构,
if (file->f_mode & FMODE_READ) {
struct seq_file *m = file->private_data;
iter = m->private;
} else
iter = file->private_data;
这个结构中包含了太多有用的信息:
struct ftrace_iterator {
loff_t pos;
loff_t func_pos;
loff_t mod_pos;
struct ftrace_page *pg;
struct dyn_ftrace *func;
struct ftrace_func_probe *probe;
struct ftrace_func_entry *probe_entry;
struct trace_parser parser;
struct ftrace_hash *hash;
struct ftrace_ops *ops;
struct trace_array *tr;
struct list_head *mod_list;
int pidx;
int idx;
unsigned flags;
};
下面只给出原文目录,详情请点击阅读原文。
2.2. ftrace_process_regex
函数
2.3. match_records
函数
2.4. ftrace_pages_start
和ftrace_pages
2.5. ftrace_match_record
函数
2.6. ftrace_match
函数
2.7. enter_record
函数
3. echo function_graph > current_tracer
3.1. tracing_set_trace_write
函数
3.2. tracing_set_tracer
函数
3.3. tracer_init
函数
3.4. graph_trace_init
函数
3.5. start_graph_tracing
函数
3.6. ftrace_startup
函数
3.6.1. __register_ftrace_function
函数
3.6.2. ftrace_update_trampoline
函数
3.6.2.1. create_trampoline
函数
3.6.3. update_ftrace_function
函数
4. cat trace
命令
5. 蹦床trampoline
函数
5.1. ftrace_stub
函数
5.2. ftrace_caller
函数
5.3. ftrace_caller_end
函数
5.4. ftrace_caller_op_ptr
函数
5.5. ftrace_call
函数
5.6. ftrace_ops_list_func
函数
点击阅读原文阅读完整文章。
以上是关于Linux-5.10.13 ftrace源码分析的主要内容,如果未能解决你的问题,请参考以下文章
Linux内核 eBPF基础:perf基础perf_event_open系统调用内核源码分析
ftrace利器之trace-cmd和kernelshark
Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )(代
Android 逆向Dalvik 函数抽取加壳 ( 类加载流程分析 | ClassLoader#loadClass 函数分析 | BaseDexClassLoader#findClass 分析 )(代
异常及源码分析org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeE(代