一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

基于linux的Ftrace簡介、案例、結果讀法以及用vim進行Ftrace折疊的解析

Linux閱碼場 ? 2018-01-24 14:14 ? 次閱讀

本文目錄

Ftrace簡介Ftrace案例Ftrace結果怎么讀?vim進行Ftrace折疊

Ftrace簡介

Ftrace是Linux進行代碼級實踐分析最有效的工具之一,比如我們進行一個系統(tǒng)調(diào)用,出來的時間過長,我們想知道時間花哪里去了,利用Ftrace就可以追蹤到一級級的時間分布。

Ftrace案例

寫一個proc模塊,包含一個proc的讀和寫的入口。test_proc_show()故意調(diào)用了一個kill_time()的函數(shù),而kill_time()的函數(shù),又調(diào)用了mdelay(2)和kill_moretime()的函數(shù),該函數(shù)體內(nèi)調(diào)用mdelay(2)。

kill_time()的函數(shù)和kill_moretime()函數(shù)前面都加了noinline以避免被編譯器inline優(yōu)化掉。

#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()這個函數(shù)。

我們把啟動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()函數(shù)就被trace了。

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

0

讀取trace的結果:

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

接著用vim打開這個文件1,發(fā)現(xiàn)這個文件有600多行:

基于linux的Ftrace簡介、案例、結果讀法以及用vim進行Ftrace折疊的解析

基于linux的Ftrace簡介、案例、結果讀法以及用vim進行Ftrace折疊的解析

Ftrace結果怎么讀?

Ftrace結果怎么讀?答案非常簡單:如果是葉子函數(shù),就直接在這個函數(shù)的前面顯示它占用的時間,如果是非葉子,要等到 }的時候,再顯示時間,如下圖:

基于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折疊的解析

繼續(xù)展開第6行的kill_time(),按za:

基于linux的Ftrace簡介、案例、結果讀法以及用vim進行Ftrace折疊的解析

我們可以用z、a兩個按鍵,搜索或者展開Ftrace的結果。

基于linux的Ftrace簡介、案例、結果讀法以及用vim進行Ftrace折疊的解析

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11425

    瀏覽量

    212398
  • VIM
    VIM
    +關注

    關注

    0

    文章

    136

    瀏覽量

    15592

原文標題:宋寶華:關于Ftrace的一個完整案例

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    linuxvim使用詳解

    linuxvim使用科普教程,供大家學習使用。
    發(fā)表于 03-16 15:41 ?0次下載

    Linux中的vim命令說明

    1.簡介 vimLinux 操作系統(tǒng)中最通用的全屏幕文本編輯器,是 vi 的增強版(vi iMproved),與 vi 完全兼容,且擴充了很多功能。 vim 編輯器支持編輯模式和
    的頭像 發(fā)表于 02-23 11:06 ?4057次閱讀
    <b class='flag-5'>Linux</b>中的<b class='flag-5'>vim</b>命令說明

    Linux內(nèi)核ftrace的學習

    目錄 1. 前言 2. ARM64棧幀結構 3. 編譯階段 3.1 未開啟ftrace時的blk_update_request 3.2 開啟ftrace時的blk_update_request 4.
    的頭像 發(fā)表于 08-13 17:33 ?3304次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>ftrace</b>的學習

    使用Ftrace研究Linux內(nèi)核

    Ftrace通過tracefs文件系統(tǒng)的控制文件來進行調(diào)試。如果內(nèi)核構建階段配置ftrace,默認會掛載tracefs到/sys/kernel/tracing,也可以在運行環(huán)境手動掛載
    的頭像 發(fā)表于 05-05 10:00 ?1861次閱讀

    深入理解Linux內(nèi)核協(xié)議棧 Surftrace對網(wǎng)絡報文增強處理

    Surftrace 是由系統(tǒng)運維 SIG 推出的一個 ftrace 封裝器和開發(fā)編譯平臺,讓用戶既能基于 libbpf 快速構建工程進行開發(fā),也能作為 ftrace 的封裝器進行 tr
    的頭像 發(fā)表于 05-12 17:57 ?2023次閱讀

    ftrace學習筆記

    本文主要是根據(jù)閱碼場 《Linux內(nèi)核tracers的實現(xiàn)原理與應用》視頻課程,我自己在aarch64上的實踐。通過觀察鉤子函數(shù)的創(chuàng)建過程以及替換過程,理解trace的原理。本文同樣以blk_update_request函數(shù)為例進行
    的頭像 發(fā)表于 11-30 09:03 ?1184次閱讀

    動態(tài)追蹤技術分類及其使用方法

    文章介紹幾種常用的內(nèi)核動態(tài)追蹤技術,對 ftrace、perf 及 eBPF 的使用方法進行案例說明。
    的頭像 發(fā)表于 01-19 16:35 ?3267次閱讀
    動態(tài)追蹤技術分類及其使用方法

    Ftrace使用tracefs文件系統(tǒng)保存控制文件

    FtraceLinux Kernel的官方tracing系統(tǒng),支持Function trace、靜態(tài)tracepoint、動態(tài)Tracepoint的跟蹤,還提供各種Tracer,用于統(tǒng)計最大irq延遲、最大函數(shù)調(diào)用棧大小、調(diào)度事件等。
    的頭像 發(fā)表于 02-22 14:34 ?1329次閱讀

    萬字長文解讀Linux內(nèi)核追蹤機制

    Linux 存在眾多 tracing tools,比如 ftrace、perf,他們可用于內(nèi)核的調(diào)試、提高內(nèi)核的可觀測性。
    的頭像 發(fā)表于 06-11 11:05 ?1030次閱讀
    萬字長文解讀<b class='flag-5'>Linux</b>內(nèi)核追蹤機制

    Linux ftrace簡介與分析

    最近遇到 i2c 傳輸慢的問題,正常一筆 i2c 傳輸 52 bytes 應該在 1ms 內(nèi)返回,但是偶爾出現(xiàn) 6 ~ 7ms 才返回,不滿足要求,因此研究一下 ftrace 工具,分析 i2c
    的頭像 發(fā)表于 07-20 11:17 ?989次閱讀

    Linux ftrace工具宏定義

    宏定義 在使用 ftrace 之前,需要確保內(nèi)核配置編譯了其配置選項。 CONFIG_FTRACE=y CONFIG_HAVE_FUNCTION_TRACER=y
    的頭像 發(fā)表于 07-20 11:18 ?802次閱讀

    linux怎么保存退出vim

    Linux系統(tǒng)中,使用vim作為編輯器是非常常見的。vim是一個強大的文本編輯器,擁有豐富的功能和快捷鍵。保存并退出vim可以通過以下步驟完成: 打開
    的頭像 發(fā)表于 11-27 14:19 ?1.1w次閱讀

    linux使用vim新建并編輯文件

    Linux系統(tǒng)下,Vim是一款功能強大的文本編輯器。它可以用于新建并編輯文件,具有很多高級功能和快捷鍵。下面是關于如何在Linux上使用Vim新建并編輯文件的細致的說明: 一、什么是
    的頭像 發(fā)表于 11-28 15:17 ?3897次閱讀

    linux怎么執(zhí)行vim編輯的程序

    Linux系統(tǒng)中執(zhí)行vim編輯的程序非常簡單,只需要依次執(zhí)行以下步驟: 打開終端:在Linux系統(tǒng)中,按下Ctrl+Alt+T組合鍵可以快速打開終端。 輸入vim命令并指定文件:在終
    的頭像 發(fā)表于 11-28 15:23 ?1106次閱讀

    LinuxVim編輯器的使用技巧

    Vim】常用總結? 簡介? image 什么是vim?? Linux下兩大編輯神器之一 vim ? L
    的頭像 發(fā)表于 04-01 17:36 ?308次閱讀
    <b class='flag-5'>Linux</b>下<b class='flag-5'>Vim</b>編輯器的使用技巧