色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

Linux中ftracer用于用戶空間分析

Linux閱碼場 ? 來源:相遇Linux ? 作者:相遇Linux ? 2021-03-10 15:33 ? 次閱讀

gcc4.6 添加了一個編譯選項 -mfentry, 當程序編譯之后,程序中的所有函數,除了notrace屬性

#define notrace __attribute__((no_instrument_function))

的函數頭上都會添加上call __fentry__,占用5個字節,__fentry__函數在程序中可以自定義, 比如在Linux kernel中被定義為 retq直接返回。

SYM_FUNC_START(__fentry__)

retq

SYM_FUNC_END(__fentry__)

定義成retq的意思是我不想直接使用__fentry__, 其實現也是在內核啟動的時候把__fentry__換成了nopl, 然后在需要trace內核函數時,再替換成對應的trampoline(中文: 蹦床)。

本篇講解ftrace(function trace)在用戶空間的應用。

以下代碼來自此git工程:

https://github.com/x-lugoo/ftracer.git

ftracer.c中對__fentry__函數進行了自定義:

ftracer.c

asm(

“ .globl __fentry__

“__fentry__:

/* save arguments */

“ push %rax

“ push %rdi

“ push %rsi

“ push %rdx

“ push %rcx

“ push %r8

“ push %r9

“ movq %rsp,%rdi

“ call ftracer

“ pop %r9

“ pop %r8

“ pop %rcx

“ pop %rdx

“ pop %rsi

“ pop %rdi

“ pop %rax

“ ret

”);

上面__fentry__函數的實現把所有傳參寄存器(x86_64架構)全部壓棧,然后把sp指針傳給ftracer()的第一個參數

__attribute__((used)) void ftracer(struct frame *fr)

{

if (!tenabled)

return;

struct trace *t = &tbuf[tcur++];

if (tcur 》= TSIZE)

tcur = 0;

t-》tstamp = __builtin_ia32_rdtsc();

t-》src = fr-》caller;

t-》dst = fr-》callee;

t-》arg1 = fr-》rdi;

t-》arg2 = fr-》rsi;

t-》arg3 = fr-》rdx;

}

struct frame {

uint64_t r9;

uint64_t r8;

uint64_t rcx;

uint64_t rdx;

uint64_t rsi;

uint64_t rdi;

uint64_t rax;

uint64_t callee;

uint64_t caller;

};

其中callee是被調用函數地址,caller是調用函數地址 ,比如f1()調用f2(), f2函數頭上調用了__fentry__, 那么__fentry__ 就可以從frame結構中的rax變量地址之后找到callee和caller

f1() {

call f2

f2() {

call __fentry__

ftracer()的實現把函數調用參數,被調用函數,調用函數,函數執行時間戳都存在tbuf中

使用一個測試程序驗證ftrace功能:

test.c

#include “ftracer.h”

#define mb() asm volatile (“” ::: “memory”)

void f3(int a, int b, int c)

{

mb();

}

void f2(int a, int b, int c)

{

f3(4, 5, 6);

}

void f1(int a, int b, int c)

{

f2(7, 8, 9);

}

main()

{

ftrace_dump_at_exit(0);

ftrace_enable();

f1(1, 2, 3);

}

函數調用關系:main-》f1-》f2-》f3

編譯:

gcc -c ftracer.cgcc -pg -mfentry ftracer.o test.c -o test

執行。/test的時候調用ftrace_dump(), 打印出tbuf中的數據,

void ftrace_dump(unsigned max)

t = &tbuf[i];

printf(“%llx %llx-》%llx %llx %llx %llx

”,

t-》tstamp,

t-》src, t-》dst,

t-》arg1, t-》arg2, t-》arg3);

tbuf中包含函數調用關系和函數執行時時間戳:

。/test

2b4fcfe84137ab 4008d1-》400893 4 5 6 (f2-》f3)

2b4fcfe8413763 4008fe-》4008ac 7 8 9 (f1-》f2)

2b4fcfe84136ee 40092d-》4008d9 1 2 3 (main-》f1)

以上函數調用關系對應各個函數代碼段:

function f2:

0x00000000004008a7 《+0》: callq 0x400657 《__fentry__》

0x00000000004008ac 《+5》: push %rbp

0x00000000004008ad 《+6》: mov %rsp,%rbp

0x00000000004008cc 《+37》: callq 0x40088e 《f3》

0x00000000004008d1 《+42》: nop

0x00000000004008d2 《+43》: leaveq

0x00000000004008d3 《+44》: retq

function f3:

0x000000000040088e 《+0》: callq 0x400657 《__fentry__》

0x0000000000400893 《+5》: push %rbp

0x00000000004008a6 《+24》: retq

function f1

0x00000000004008d4 《+0》: callq 0x400657 《__fentry__》

0x00000000004008d9 《+5》: push %rbp

0x00000000004008f4 《+32》: mov $0x7,%edi

0x00000000004008f9 《+37》: callq 0x4008a7 《f2》

0x00000000004008fe 《+42》: nop

0x00000000004008ff 《+43》: leaveq

0x0000000000400900 《+44》: retq

function main

0x0000000000400901 《+0》: callq 0x400657 《__fentry__》

0x0000000000400928 《+39》: callq 0x4008d4 《f1》

0x000000000040092d 《+44》: mov $0x0,%eax

0x0000000000400932 《+49》: pop %rbp

0x0000000000400933 《+50》: retq

總結:以上分析了ftracer用于用戶空間,可以跟蹤函數調用參數和函數執行時間戳。

小編最新一直被催更微信公眾號文章,我最近一直在設計優化tracer視頻課程,內容已經迭代了四五次了,希望到時候能通俗易懂、圖文并茂地講解Linux內核中function tracer /function graph/ kprobe/kretprobe/trace event 的最底層原理和應用,預期三月下旬發布。

掌握之后將對Linux kernel的研究學習方式和debug方式帶來很大的幫助,big picture 如下圖所示:

原文標題:當ftrace用于用戶空間

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    87

    文章

    11342

    瀏覽量

    210140
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81293

原文標題:當ftrace用于用戶空間

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

收藏 人收藏

    評論

    相關推薦

    禁止使用root用戶通過ssh遠程登錄Linux

    1、背景描述 出于安全考慮,需要禁止使用root用戶通過ssh遠程登錄Linux 禁用root用戶遠程登錄后,需要提供一個權限用戶用于ssh
    的頭像 發表于 12-21 16:25 ?469次閱讀
    禁止使用root<b class='flag-5'>用戶</b>通過ssh遠程登錄<b class='flag-5'>Linux</b>

    Linux用戶與創建

    Linux用戶與創建 用戶的類型 超級管理用戶: 權限最高的用戶(uid:0) #uid:是
    的頭像 發表于 12-20 14:24 ?296次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b>的<b class='flag-5'>用戶</b>與創建

    Linux用戶管理終極指南:從基礎到進階

    登陸系統,只不過Linux支持多個用戶同時登陸。 F:難道Windows就不算多用戶操作系統嗎? Q:其實不是,在Windows系統可以創建多個
    的頭像 發表于 12-04 11:42 ?252次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>用戶</b>管理終極指南:從基礎到進階

    Linux學習之用戶管理

    Linux學習——用戶管理 1用戶/組概覽 Linux系統是多用戶、多任務的分時操作系統,系統上每一個進程都有一個特定的文件,每個文件都被一
    的頭像 發表于 11-25 10:47 ?292次閱讀

    Linux系統shell命令解析

    shell是Linux系統的用戶界面,提供了用戶與內核交互的一種接口,它接收用戶輸入的命令并到送到內核去執行,因此也被稱為Linux的命令解
    的頭像 發表于 11-05 15:40 ?357次閱讀

    Linux用戶管理詳解

    用戶分為普通用戶和超級用戶,超級用戶在Windows系統為Administrator在Linux
    的頭像 發表于 11-01 09:48 ?217次閱讀

    詳解linux內核的uevent機制

    linux內核,uevent機制是一種內核和用戶空間通信的機制,用于通知用戶
    的頭像 發表于 09-29 17:01 ?890次閱讀

    linux驅動程序運行在什么空間

    空間擁有對硬件的直接訪問權限,而用戶空間則受到限制,以保護系統的穩定性和安全性。 1. Linux 內核和驅動程序概述 Linux 內核是操
    的頭像 發表于 08-30 14:37 ?494次閱讀

    高質量激光光束光學系統空間濾波

    空間濾波是光學的一項關鍵技術,用于細化激光束,提高其質量,并最大限度地減少像差和不必要的衍射效應。通過采用透鏡和光闌的組合,空間濾波選擇性地從激光束中去除不想要的成分,例如噪聲、衍射
    發表于 08-14 11:54

    Linux查看IP地址的方法

    ifconfig是一個網絡管理工具,用于配置、控制和查詢網絡接口。在許多舊的Linux發行版,ifconfig是查看和配置網絡接口的主要工具。
    的頭像 發表于 08-07 15:16 ?7852次閱讀
    在<b class='flag-5'>Linux</b><b class='flag-5'>中</b>查看IP地址的方法

    stm8l051的bootrom空間怎么用來做bootloader?

    stm8l051有一塊bootrom空間(define region BootROM = [from 0x6000 to 0x67FF];), 這塊空間是開放給用戶的嗎,開放的話怎么
    發表于 05-08 06:27

    gis建模與空間分析的區別

    GIS建模與空間分析是地理信息系統(GIS)領域中兩個重要的概念,它們雖然有一定的聯系,但在目的、步驟和應用方面存在明顯的區別。本文將從理論和實際應用的角度,詳盡、詳實、細致地對GIS建模與空間
    的頭像 發表于 02-25 14:57 ?1015次閱讀

    gis空間分析包括哪些內容

    GIS(地理信息系統)空間分析是指通過使用GIS軟件和方法,對地理空間數據進行處理、分析、建模和展示的過程。它結合了地理學、數學、計算機科學和統計學的原理和方法,在解決地理問題和支持決
    的頭像 發表于 02-25 13:50 ?1890次閱讀

    gis中常用的空間分析方法

    GIS中常用的空間分析方法 GIS(地理信息系統)是一種用于收集、存儲、處理、分析和展示地理數據的技術。空間
    的頭像 發表于 02-25 13:44 ?5985次閱讀

    arcgis空間分析方法有哪些

    (Spatial Query):通過定義空間關系,如鄰近、包含、相交等,來檢索滿足條件的要素。 緩沖區分析(Buffer Analysis):創建一定距離范圍內的緩沖區,用于分析要素的
    的頭像 發表于 02-25 11:36 ?2488次閱讀
    主站蜘蛛池模板: 羞羞答答的免费视频在线观看 | 亚洲精品无码国产爽快A片百度 | 99热这里只有是精品 | 成人毛片100部免费看 | 精品国产乱码久久久久久夜深人妻 | 国产91综合 | 午夜在线观看免费完整直播网页 | 亚洲一区二区三区高清网 | 亚洲 欧美 国产 视频二区 | 国产白丝精品爽爽久久蜜臀 | 中文字幕人成人乱码亚洲AV | 亚洲 欧美 日韩 精品 自拍 | 久久久精品日本一区二区三区 | 第一福利在线永久视频 | 伊人久久大香线蕉综合高清 | JIZZ19学生第一次 | 娇喘嗯嗯 轻点啊视频福利 娇喘高潮教室h | 网址在线观看你懂我意思吧免费的 | 99这里有精品视频视频 | 亚洲欧美日韩中字视频三区 | 亚洲A片不卡无码久久尤物 亚洲a免费 | 国产午夜精品一区二区三区 | 成人人观看的免费毛片 | 精品视频久久久久 | 啊叫大点声欠CAO的SAO贷 | 久久99综合国产精品亚洲首页 | 国产成人久久婷婷精品流白浆 | 最近2019年日本中文免费字幕 | 新金梅瓶玉蒲团性奴3 | 龙岩综合频道 | 久久99综合国产精品亚洲首页 | 国产成人综合高清在线观看 | chinese情侣自拍啪hd | 日日摸天天添天天添无码蜜臀 | 午夜精品久久久内射近拍高清 | 国产成人高清在线观看播放 | 成视频高清 | 午夜在线视频国产极品片 | 小SAO货边洗澡边CAO你动漫 | 拔擦拔擦8X永久华人免费播放器 | 伸进同桌奶罩里摸她胸作文 |