在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    11329

    瀏覽量

    209967
  • VIM
    VIM
    +關注

    關注

    0

    文章

    134

    瀏覽量

    15312

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

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

收藏 人收藏

    評論

    相關推薦

    linuxvim使用詳解

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

    Linux中的vim命令說明

    1.簡介 vimLinux 操作系統中最通用的全屏幕文本編輯器,是 vi 的增強版(vi iMproved),與 vi 完全兼容,且擴充了很多功能。 vim 編輯器支持編輯模式和
    的頭像 發表于 02-23 11:06 ?3920次閱讀
    <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 ?3162次閱讀
    <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 ?1689次閱讀

    深入理解Linux內核協議棧 Surftrace對網絡報文增強處理

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

    ftrace學習筆記

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

    動態追蹤技術分類及其使用方法

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

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

    FtraceLinux Kernel的官方tracing系統,支持Function trace、靜態tracepoint、動態Tracepoint的跟蹤,還提供各種Tracer,用于統計最大irq延遲、最大函數調用棧大小、調度事件等。
    的頭像 發表于 02-22 14:34 ?1169次閱讀

    萬字長文解讀Linux內核追蹤機制

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

    Linux ftrace簡介與分析

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

    Linux ftrace工具宏定義

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

    linux怎么執行vim編輯的程序

    Linux中,你可以通過以下步驟執行Vim編輯器中編寫的程序: 打開終端或命令行界面。 使用Vim編輯器打開你的程序文件。假設你的程序文件名為"program.c",可以使用以下命令打開文件并進
    的頭像 發表于 11-26 15:45 ?1198次閱讀

    linux怎么保存退出vim

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

    linux使用vim新建并編輯文件

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

    linux怎么執行vim編輯的程序

    Linux系統中執行vim編輯的程序非常簡單,只需要依次執行以下步驟: 打開終端:在Linux系統中,按下Ctrl+Alt+T組合鍵可以快速打開終端。 輸入vim命令并指定文件:在終
    的頭像 發表于 11-28 15:23 ?927次閱讀
    主站蜘蛛池模板: 亚洲一区免费看| 亚洲xx网站| 久久国产免费观看| 久久国产精品系列| www操| www狠狠| 激情五月俺来也| 456亚洲人成影院在线观| 天天干天天操天天| 久久国产色| 国产亚洲精品成人a在线| a天堂资源| 天堂网在线最新版www| 高清不卡毛片免费观看| 非常黄的网站| 免费a网站| 性欧美videofree视频另类| 三级视频在线| 久久久免费视频观看| 琪琪see色原网一区二区| 免费亚洲成人| 超级碰碰青草久热国产| 天天干天天弄| 99福利| 乱高h辣黄文np公交车| 五月婷婷影视| 久久这里精品青草免费| 怡红院影院| 国产成人精品午夜二三区| 亚洲一区三区| 婷婷射| 黄色网址在线免费观看| 天天做天天爱天天综合网| 国产伦精品一区二区三区高清| h黄色| 五月婷婷视频在线观看| 久久综合精品视频| 五月天婷婷影院| 人人爽人人干| 久久9966精品国产免费| 91大神免费视频|