Linux-5.10.13 ftrace源码分析

Posted 全波形反演

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-5.10.13 ftrace源码分析相关的知识,希望对你有一定的参考价值。



1. 从set_ftrace_filter讲起

/sys/kernel/debug/tracing/tracing_on

sucd /sys/kernel/debug/tracing/echo 1 > tracing_onecho "schedule" > set_ftrace_filterecho function_graph > current_tracercat 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_startftrace_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

ftrace在实际问题中的应用

Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )(代

Android 逆向Dalvik 函数抽取加壳 ( 类加载流程分析 | ClassLoader#loadClass 函数分析 | BaseDexClassLoader#findClass 分析 )(代

异常及源码分析org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeE(代