宋宝华:关于Ftrace的一个完整案例,完整的wbs案例_Linux_青云站长教程网
欢迎来到站长教程网!
  • 秒到短信接口 免费试用
  • 微信支付宝接口 秒结算
  • 中文网站排名|申请加入
  • 搜索引擎全站查询
  • 查询移动网站权重数据
  • 海外主机 台湾公司直销
  • Linux

    当前位置:主页 > 服务器教程 > Linux >

    宋宝华:关于Ftrace的一个完整案例,完整的wbs案例

    时间:2019-11-09|栏目:Linux|点击:
  • 作者: 宋宝华

    来源: 微信公众号linux阅码场(id: linuxdev)

    file

    Ftrace简介

    Ftrace是Linux进行代码级实践分析最有效的工具之一,比如我们进行一个系统调用,出来的时间过长,我们想知道时间花哪里去了,利用Ftrace就可以追踪到一级级的时间分布。

    Ftrace案例

    写一个proc模块,包含一个proc的读和写的入口。test_proc_show()故意调用了一个kill_time()的函数,而kill_time()的函数,又调用了mdelay(2)和kill_moretime()的函数,该函数体内调用mdelay(2)。

    kill_time()的函数和kill_moretime()函数前面都加了noinline以避免被编译器inline优化掉。

    #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/version.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include <linux/delay.h> #include <linux/uaccess.h> 
 static unsigned int variable; static struct proc_dir_entry *test_dir, *test_entry; 
 static noinline void kill_moretime(void) { mdelay(2); } 
 static noinline void kill_time(void) { mdelay(2); kill_moretime(); } 
 static int test_proc_show(struct seq_file *seq, void *v) { unsigned int *ptr_var = seq->private; kill_time(); seq_printf(seq, "%u\n", *ptr_var); return 0; } 
 static ssize_t test_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { struct seq_file *seq = file->private_data; unsigned int *ptr_var = seq->private; int err; char *kbuffer; 
         if (!buffer || count > PAGE_SIZE - 1)                 return -EINVAL; 
 kbuffer = (char *)__get_free_page(GFP_KERNEL); if (!kbuffer) return -ENOMEM; 
 err = -EFAULT; if (copy_from_user(kbuffer, buffer, count)) goto out; kbuffer[count] = '\0'; 
 *ptr_var = simple_strtoul(kbuffer, NULL, 10); return count; 
 out: free_page((unsigned long)buffer); return err; } 
 static int test_proc_open(struct inode *inode, struct file *file) { return single_open(file, test_proc_show, PDE_DATA(inode)); } 
 static const struct file_operations test_proc_fops = { .owner = THIS_MODULE, .open = test_proc_open, .read = seq_read, .write = test_proc_write, .llseek = seq_lseek, .release = single_release, }; 
 static __init int test_proc_init(void) { test_dir = proc_mkdir("test_dir", NULL); if (test_dir) { test_entry = proc_create_data("test_rw",0666, test_dir, &test_proc_fops, &variable); if (test_entry) return 0; } 
 return -ENOMEM; } module_init(test_proc_init); 
 static __exit void test_proc_cleanup(void) { remove_proc_entry("test_rw", test_dir); remove_proc_entry("test_dir", NULL); } module_exit(test_proc_cleanup); 
 MODULE_AUTHOR("Barry Song <baohua@kernel.org>"); MODULE_DESCRIPTION("proc exmaple"); MODULE_LICENSE("GPL v2");

    模块对应的Makefile如下:

    KVERS = $(shell uname -r) 
 # Kernel modules obj-m += proc.o 
 # Specify flags for the module compilation. #EXTRA_CFLAGS=-g -O0 
 build: kernel_modules 
 kernel_modules: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules 
 clean: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

    编译并且加载:

    $ make baohua@baohua-perf:~/develop/training/debug/ftrace/proc$  $ sudo insmod proc.ko [sudo] password for baohua: 

    之后/proc目录下/proc/test_dir/test_rw文件可被读写。

    下面我们用Ftrace来跟踪test_proc_show()这个函数。

    我们把启动ftrace的所有命令写到一个脚本function.sh里面:

    #!/bin/bash 
 debugfs=/sys/kernel/debug echo nop > $debugfs/tracing/current_tracer echo 0 > $debugfs/tracing/tracing_on echo $$ > $debugfs/tracing/set_ftrace_pid echo function_graph > $debugfs/tracing/current_tracer #replace test_proc_show by your function name echo test_proc_show > $debugfs/tracing/set_graph_function echo 1 > $debugfs/tracing/tracing_on exec "$@"

    然后用这个脚本去启动cat /proc/test_dir/test_rw,这样ftrace下面test_proc_show()函数就被trace了。

    # ./function.sh cat /proc/test_dir/test_rw 0

    读取trace的结果:

    # cat /sys/kernel/debug/tracing/trace > 1

    接着用vim打开这个文件1,发现这个文件有600多行:

    file

    file

    长到看不清!!

    Ftrace结果怎么读?

    Ftrace结果怎么读?答案非常简单:如果是叶子函数,就直接在这个函数的前面显示它占用的时间,如果是非叶子,要等到 }的时候,再显示时间,如下图:

    file

    上一篇:Linux root设置初始值的方法,反隐root

    栏    目:Linux

    下一篇:linux 命令之touch,linuxtouch命令

    本文标题:宋宝华:关于Ftrace的一个完整案例,完整的wbs案例

    本文地址:http://www.jh-floor.com/fuwuqijiaocheng/Linux/123556.html

    广告投放 | 联系我们 | 版权申明

    重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

    如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

    联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

    Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号