0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

Linux阅码场 2018-01-24 14:14 次阅读

本文目录

Ftrace简介Ftrace案例Ftrace结果怎么读?vim进行Ftrace折叠

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

#include

#include

#include

#include

#include

#include

#include

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 ");

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多行:

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

Ftrace结果怎么读?

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

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

延迟比较大的部分,会有+、#等特殊标号:

'$' - greater than 1 second '@' - greater than 100 milisecond '*' - greater than 10 milisecond '#' - greater than 1000 microsecond '!' - greater than 100 microsecond '+' - greater than 10 microsecond ' ' - less than or equal to 10 microsecond.

vim对Ftrace进行折叠

上面那个Ftrace文件太大了,大到看不清。我们可以用vim来折叠之,不过需要一个vim的特别配置,我把它存放在了我的~目录,名字叫.fungraph-vim:

" Enable folding for ftrace function_graph traces.

"

" To use, :source this file while viewing a function_graph trace, or use vim's

" -S option to load from the command-line together with a trace. You can then

" use the usual vim fold commands, such as "za", to open and close nested

" functions. While closed, a fold will show the total time taken for a call,

" as would normally appear on the line with the closing brace. Folded

" functions will not include finish_task_switch(), so folding should remain

" relatively sane even through a context switch.

"

" Note that this will almost certainly only work well with a

" single-CPU trace (e.g. trace-cmd report --cpu 1).

function! FunctionGraphFoldExpr(lnum)

let line = getline(a:lnum)

if line[-1:] == '{'

if line =~ 'finish_task_switch() {$'

return '>1'

endif

return 'a1'

elseif line[-1:] == '}'

return 's1'

else

return '='

endif

endfunction

function! FunctionGraphFoldText()

let s = split(getline(v:foldstart), '|', 1)

if getline(v:foldend+1) =~ 'finish_task_switch() {$'

let s[2] = ' task switch '

else

let e = split(getline(v:foldend), '|', 1)

let s[2] = e[2]

endif

return join(s, '|')

endfunction

setlocal foldexpr=FunctionGraphFoldExpr(v:lnum)

setlocal foldtext=FunctionGraphFoldText()

setlocal foldcolumn=12

setlocal foldmethod=expr

之后我们配置vim为这个模板来打开前面那个600多行的文件1:

vim -S ~/.fungraph-vim 1

这样我们看到的样子是:

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

我们可以把光标移动到第5行,键盘敲打za,则展开为:

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

继续展开第6行的kill_time(),按za:

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

我们可以用z、a两个按键,搜索或者展开Ftrace的结果。

基于linux的Ftrace简介、案例、结果读法以及用vim进行Ftrace折叠的解析

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206733
  • VIM
    VIM
    +关注

    关注

    0

    文章

    129

    浏览量

    15180

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

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    linux vim命令总结

    命令的参数 如 :write !wc 返回当前文件的字符数 :w :write的缩写 :edit(e) 打开,编辑 ZZ保存并退出 zz将光标所在行移至窗口中间 :q退出 vim -R file 只读模式
    发表于 07-03 00:27

    linuxvim使用详解

    linuxvim使用科普教程,供大家学习使用。
    发表于 03-16 15:41 0次下载

    Linux中的vim命令说明

    1.简介 vimLinux 操作系统中最通用的全屏幕文本编辑器,是 vi 的增强版(vi iMproved),与 vi 完全兼容,且扩充了很多功能。 vim 编辑器支持编辑模式和
    的头像 发表于 02-23 11:06 3564次阅读
    <b class='flag-5'>Linux</b>中的<b class='flag-5'>vim</b>命令说明

    Linux内核ftrace的学习

    目录 1. 前言 2. ARM64栈帧结构 3. 编译阶段 3.1 未开启ftrace时的blk_update_request 3.2 开启ftrace时的blk_update_request 4.
    的头像 发表于 08-13 17:33 2833次阅读
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>ftrace</b>的学习

    使用Ftrace研究Linux内核

    Ftrace通过tracefs文件系统的控制文件来进行调试。如果内核构建阶段配置ftrace,默认会挂载tracefs到/sys/kernel/tracing,也可以在运行环境手动挂载
    的头像 发表于 05-05 10:00 1283次阅读

    深入理解Linux内核协议栈 Surftrace对网络报文增强处理

    Surftrace 是由系统运维 SIG 推出的一个 ftrace 封装器和开发编译平台,让用户既能基于 libbpf 快速构建工程进行开发,也能作为 ftrace 的封装器进行 tr
    的头像 发表于 05-12 17:57 1553次阅读

    ftrace学习笔记

    本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》视频课程,我自己在aarch64上的实践。通过观察钩子函数的创建过程以及替换过程,理解trace的原理。本文同样以blk_update_request函数为例进行
    的头像 发表于 11-30 09:03 826次阅读

    Ftrace使用tracefs文件系统保存控制文件

    FtraceLinux Kernel的官方tracing系统,支持Function trace、静态tracepoint、动态Tracepoint的跟踪,还提供各种Tracer,用于统计最大irq延迟、最大函数调用栈大小、调度事件等。
    的头像 发表于 02-22 14:34 867次阅读

    万字长文解读Linux内核追踪机制

    Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。
    的头像 发表于 06-11 11:05 467次阅读
    万字长文解读<b class='flag-5'>Linux</b>内核追踪机制

    Linux ftrace简介与分析

    最近遇到 i2c 传输慢的问题,正常一笔 i2c 传输 52 bytes 应该在 1ms 内返回,但是偶尔出现 6 ~ 7ms 才返回,不满足要求,因此研究一下 ftrace 工具,分析 i2c
    的头像 发表于 07-20 11:17 540次阅读

    Linux ftrace工具宏定义

    宏定义 在使用 ftrace 之前,需要确保内核配置编译了其配置选项。 CONFIG_FTRACE=y CONFIG_HAVE_FUNCTION_TRACER
    的头像 发表于 07-20 11:18 449次阅读

    linux怎么执行vim编辑的程序

    Linux中,你可以通过以下步骤执行Vim编辑器中编写的程序: 打开终端或命令行界面。 使用Vim编辑器打开你的程序文件。假设你的程序文件名为"program.c",可以使用以下命令打开文件并进
    的头像 发表于 11-26 15:45 519次阅读

    linux怎么保存退出vim

    Linux系统中,使用vim作为编辑器是非常常见的。vim是一个强大的文本编辑器,拥有丰富的功能和快捷键。保存并退出vim可以通过以下步骤完成: 打开
    的头像 发表于 11-27 14:19 3587次阅读

    linux使用vim新建并编辑文件

    Linux系统下,Vim是一款功能强大的文本编辑器。它可以用于新建并编辑文件,具有很多高级功能和快捷键。下面是关于如何在Linux上使用Vim新建并编辑文件的细致的说明: 一、什么是
    的头像 发表于 11-28 15:17 1018次阅读

    linux怎么执行vim编辑的程序

    Linux系统中执行vim编辑的程序非常简单,只需要依次执行以下步骤: 打开终端:在Linux系统中,按下Ctrl+Alt+T组合键可以快速打开终端。 输入vim命令并指定文件:在终
    的头像 发表于 11-28 15:23 370次阅读