日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

Linux中ftracer用于用戶空間分析

Linux閱碼場 ? 來源:相遇Linux ? 作者:相遇Linux ? 2021-03-10 15:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

#define notrace __attribute__((no_instrument_function))

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

SYM_FUNC_START(__fentry__)

retq

SYM_FUNC_END(__fentry__)

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

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

以下代碼來自此git工程:

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

ftracer.c中對__fentry__函數(shù)進(jìn)行了自定義:

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__函數(shù)的實現(xiàn)把所有傳參寄存器(x86_64架構(gòu))全部壓棧,然后把sp指針傳給ftracer()的第一個參數(shù)。

__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是被調(diào)用函數(shù)地址,caller是調(diào)用函數(shù)地址 ,比如f1()調(diào)用f2(), f2函數(shù)頭上調(diào)用了__fentry__, 那么__fentry__ 就可以從frame結(jié)構(gòu)中的rax變量地址之后找到callee和caller

f1() {

call f2

f2() {

call __fentry__

ftracer()的實現(xiàn)把函數(shù)調(diào)用參數(shù),被調(diào)用函數(shù),調(diào)用函數(shù),函數(shù)執(zhí)行時間戳都存在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);

}

函數(shù)調(diào)用關(guān)系:main-》f1-》f2-》f3

編譯:

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

執(zhí)行。/test的時候調(diào)用ftrace_dump(), 打印出tbuf中的數(shù)據(jù),

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中包含函數(shù)調(diào)用關(guān)系和函數(shù)執(zhí)行時時間戳:

。/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)

以上函數(shù)調(diào)用關(guān)系對應(yīng)各個函數(shù)代碼段:

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

總結(jié):以上分析了ftracer用于用戶空間,可以跟蹤函數(shù)調(diào)用參數(shù)和函數(shù)執(zhí)行時間戳。

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

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

原文標(biāo)題:當(dāng)ftrace用于用戶空間

文章出處:【微信公眾號:Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

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

    關(guān)注

    88

    文章

    11822

    瀏覽量

    219605
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3849

    瀏覽量

    85496

原文標(biāo)題:當(dāng)ftrace用于用戶空間

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何理解Linux內(nèi)核的PCIe驅(qū)動

    各異的芯片組,加上各種 PCI 設(shè)備自身獨(dú)特的功能需求,Linux 內(nèi)核的 PCI 支持遠(yuǎn)比我們希望的要復(fù)雜得多。今天這篇文章,我們將從驅(qū)動開發(fā)的視角,梳理 Linux PCI 設(shè)備驅(qū)動的核心生命周期與關(guān)鍵 API。
    的頭像 發(fā)表于 04-11 17:22 ?1291次閱讀

    Linux下擴(kuò)充Swap交換空間:解決內(nèi)存不足的實用指南,這些影響要注意!

    大家在使用 Linux 系統(tǒng)(比如常用的 Ubuntu)時,是不是偶爾會遇到 “內(nèi)存不足” 的彈窗?比如運(yùn)行大型編譯任務(wù)、多開虛擬機(jī)、做數(shù)據(jù)分析,或者把 Linux 當(dāng)服務(wù)器用的時候,物理內(nèi)存一旦 “告急”,系統(tǒng)就會卡頓甚至崩潰
    的頭像 發(fā)表于 02-09 16:33 ?569次閱讀
    <b class='flag-5'>Linux</b>下擴(kuò)充Swap交換<b class='flag-5'>空間</b>:解決內(nèi)存不足的實用指南,這些影響要注意!

    Linux進(jìn)程樹分析工具pstree詳解與實戰(zhàn)指南(另一視角優(yōu)化Linux系統(tǒng))

    Linux 系統(tǒng)開發(fā)與運(yùn)維,理解進(jìn)程的運(yùn)行狀態(tài)和相互關(guān)系是排查問題、優(yōu)化性能的基礎(chǔ)。pstree 作為一款輕量高效的進(jìn)程樹可視化工具,能直觀展示系統(tǒng)中所有進(jìn)程的父子關(guān)系,為系統(tǒng)分析提供關(guān)鍵線索。本文將從基礎(chǔ)用法到實戰(zhàn)優(yōu)化,
    的頭像 發(fā)表于 02-04 16:21 ?921次閱讀
    <b class='flag-5'>Linux</b>進(jìn)程樹<b class='flag-5'>分析</b>工具pstree詳解與實戰(zhàn)指南(另一視角優(yōu)化<b class='flag-5'>Linux</b>系統(tǒng))

    Linux磁盤管理指令合集:從查看、分區(qū)到修復(fù)

    Linux 服務(wù)器運(yùn)維或日常使用,磁盤管理是高頻操作 —— 無論是排查磁盤空間不足的問題,還是新增硬盤后的分區(qū)配置,都離不開一系列核心指令。今天就為大家整理一份「Linux 磁盤
    的頭像 發(fā)表于 02-03 16:07 ?3563次閱讀
    <b class='flag-5'>Linux</b>磁盤管理指令合集:從查看、分區(qū)到修復(fù)

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內(nèi)核內(nèi)存分配

    每個內(nèi)存地址是虛擬的,不是直接指向RAM的任何地址。當(dāng)用戶訪問內(nèi)存的存儲單元時,都會進(jìn)行地址轉(zhuǎn)換以匹配相應(yīng)的物理內(nèi)存。書籍的第10章討論了五個主題,對Linux內(nèi)核內(nèi)存分配進(jìn)行詳細(xì)
    發(fā)表于 01-16 20:05

    利用拼多多用戶API進(jìn)行粉絲數(shù)據(jù)分析,有效提升用戶粘性

    ? 在電商運(yùn)營,理解并維系核心用戶群體至關(guān)重要。拼多多開放平臺提供的用戶API,特別是與粉絲數(shù)據(jù)相關(guān)的接口,為商家深入分析粉絲行為、精準(zhǔn)運(yùn)營、提升
    的頭像 發(fā)表于 12-30 10:38 ?388次閱讀
    利用拼多多<b class='flag-5'>用戶</b>API進(jìn)行粉絲數(shù)據(jù)<b class='flag-5'>分析</b>,有效提升<b class='flag-5'>用戶</b>粘性

    如何在Linux列出USB設(shè)備

    Electronics Co., Ltd ... 這些命令將幫助你輕松列出Linux系統(tǒng)連接的USB設(shè)備,以及獲取相關(guān)信息。安裝相應(yīng)的工具來執(zhí)行這些命令,你將能夠更好地管理和調(diào)試USB設(shè)備。無論是普通用戶,還是系統(tǒng)管理員,都
    發(fā)表于 12-24 08:19

    解析Linux的進(jìn)程、線程和協(xié)程

    )進(jìn)程間通信(IPC):Linux提供了多種IPC機(jī)制,如管道、信號、共享內(nèi)存和消息隊列,用于進(jìn)程之間的通信。 線程管理 在Linux,線程可以通過pthread庫來管理。線程共享同
    發(fā)表于 12-22 11:00

    請問如何利用 Keil 分析 MCU 堆棧空間?

    如何利用 Keil 分析 MCU 堆棧空間
    發(fā)表于 11-26 07:38

    貿(mào)澤開售適用于空間受限應(yīng)用的高電壓連接的 Molex SideWize連接器

    節(jié)省空間的直角設(shè)計,提供可靠的高壓大電流連接,設(shè)計用于在各種應(yīng)用傳輸電力,包括儲能、電動汽車 (EV) 充電樁、數(shù)據(jù)中心服務(wù)器、工業(yè)自動化和電信。 Molex SideWize連接器采用直角插座,可
    的頭像 發(fā)表于 11-24 16:34 ?1000次閱讀
    貿(mào)澤開售適<b class='flag-5'>用于</b><b class='flag-5'>空間</b>受限應(yīng)用<b class='flag-5'>中</b>的高電壓連接的 Molex SideWize連接器

    探索操作系統(tǒng)底層的關(guān)鍵接口

      在linux,將程序的運(yùn)行空間分為內(nèi)核空間用戶空間(內(nèi)核態(tài)和
    的頭像 發(fā)表于 11-08 12:42 ?896次閱讀

    深入了解系統(tǒng)調(diào)用API:探索操作系統(tǒng)底層的關(guān)鍵接口

    一、前言 為什么用戶程序不能直接訪問系統(tǒng)內(nèi)核模式提供的服務(wù)? 在linux,將程序的運(yùn)行空間分為內(nèi)核空間
    的頭像 發(fā)表于 11-03 09:20 ?908次閱讀

    linux系統(tǒng),通過I2C和CCG5通訊,有沒有和CCG5通過I2C進(jìn)行固件升級?狀態(tài)配置的有沒有可以參考的源代碼?

    linux系統(tǒng),通過I2C和CCG5通訊,有沒有和CCG5通過I2C進(jìn)行固件升級,狀態(tài)配置的 有沒有可以參考的源代碼? 固件升級是在linux kernel里面實現(xiàn) 還是在用戶
    發(fā)表于 07-17 06:59

    Linux嵌入式和單片機(jī)嵌入式的區(qū)別?

    、可定制性、開放源代碼、良好的兼容性、強(qiáng)大的網(wǎng)絡(luò)支持、多任務(wù)支持、豐富的軟件生態(tài)系統(tǒng)。 架構(gòu):應(yīng)用程序運(yùn)行在用戶空間,硬件訪問和控制通常在內(nèi)核空間的驅(qū)動層實現(xiàn)。 運(yùn)行芯片:通常稱為M
    發(fā)表于 06-20 09:46

    Linux系統(tǒng)管理的核心概念

    在前一篇文章,我們深入探討了Linux的文件操作命令,如cp、mv、rm,以及文本處理命令grep、wc和管道符。本文將繼續(xù)深入Linux系統(tǒng)管理的核心概念,包括root
    的頭像 發(fā)表于 05-15 17:05 ?852次閱讀
    西藏| 增城市| 通城县| 崇州市| 获嘉县| 北流市| 峨山| 乳源| 扶风县| 易门县| 虎林市| 南江县| 水富县| 海口市| 平阴县| 南木林县| 湄潭县| 龙里县| 九龙城区| 平果县| 白玉县| 双江| 塔城市| 赤峰市| 闽侯县| 岳普湖县| 南宫市| 怀远县| 满洲里市| 云霄县| 集安市| 巴东县| 冷水江市| 五台县| 清远市| 乌兰察布市| 贺兰县| 久治县| 奉新县| 绥宁县| 木里|