当前位置: 首页 > news >正文

function tracer 和 function graph tracer的实现原理

1、function tracer 和 function graph tracer 实现原理1 - 编译阶段

(Linux 5.12-rc3)

function tracer 和 function graph tracer的实现是依赖 gcc 来辅助的,在编译内核的过程中,会加上一下gcc 编译选项,如下:

 gcc的-pg编译选项,在每个函数的开始增加一个stub,这样在需要的时候可以控制函数跳转到指定的代码中去执行。-mfentry 会在编译的时候,在每一个可以被trace的函数头部加入一个 __fenrty__ 的函数,这个函数是内核实现的 。

 比如以 函数 blk_update_request() 为例,  objdump -d 和 -r 命令反汇编后查看,在编译时 需要在 blk_update_request 函数的入口地址0x2830之后 ,也就是 0x2831地址,重定位加入 __fentry__

objdump -r  显示文件的重定位入口

objdump -d 对包含机器指令的段进行反汇编

--mrecord-mcount 参数,以上图为例,会在编译程序时,创建一个 __mcount_loc 的 数据段重定位段,会将 函数的入口地址,也就是函数在 blk-core.c 中的偏移量 存到 0x1c8这个地方,0x1c0 存储的 2770是其它函数的偏移量。

注意:

  •  有的gcc版本不支持 -mrecord-mcount, 这个时候就会使用 scripts/recordmcout.pl 脚本,这个脚本实现的功能是一样的。
  • inline 函数是无法被 trace的,因为 被定义了 notrace 属性。如果函数被定义了以下属性,即便加了 -pg -mfentry -mrecord-mcount 也不可以被trace
    #define inline notrace#define notrace __attribute__((no_instrument_function))

2、function tracer 和 function graph tracer 链接

 在 x6 架构下,使用 gdb vmlinux 反汇编 查看 __fentry__ ,可以看到直接就返回了,这说明内核并不想用 __fentry__来做回调

前面讲到 编译的时候 加上 -mrecord-mcount 参数后,会在编译的时候生成一个 __mcount_loc 的数据段, 

 ​​​​​​​

我们可以在 include/asm-generic/vmlinux.lds.h 这个连接脚本中 查看 这个段的起始和结束地址。



 

 

相关文章:

  • Vue基础之模板语法介绍
  • GoAdmin各个框架版本
  • Python 计算思维训练——地图模拟
  • 【AI理论学习】关于Attention机制的全面理解
  • 125款程序员专属情人节表白网站【建议收藏】HTML+CSS+JavaScript
  • 如何让 JSON 中的日期格式在 ruby 与 Swift 间保持一致
  • 2022速卖通海外双11招商节点公布:举办世界杯专场叠加黑色星期五,将迎来消费高潮
  • vue导入与导出 excel 表格内容
  • 【Spring】Sring基础概念(黑马SSM学习笔记)
  • 一分钟教你怎么把录音转文字
  • SpringBoot页面国际化
  • springcloud-hystrix详解(含java代码)
  • WebSocket | Netty实现WebSocket服务端
  • TypeScript——TS简介(面试题)、运行环境、变量声明、基础类型、类型断言、初识接口
  • 使用PyCharm写脚本运行时报错“This version of ChromeDriver only supports Chrome version 98”
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【347天】每日项目总结系列085(2018.01.18)
  • Android 控件背景颜色处理
  • Codepen 每日精选(2018-3-25)
  • interface和setter,getter
  • JAVA 学习IO流
  • JavaScript中的对象个人分享
  • Laravel Telescope:优雅的应用调试工具
  • leetcode讲解--894. All Possible Full Binary Trees
  • Octave 入门
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 关于for循环的简单归纳
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 那些被忽略的 JavaScript 数组方法细节
  • 嵌入式文件系统
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 智能合约开发环境搭建及Hello World合约
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​如何防止网络攻击?
  • ()、[]、{}、(())、[[]]命令替换
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4.10~4.16)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (二)fiber的基本认识
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm码农论坛 毕业设计 231126
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(一):@echo off
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Reactor简单使用教程
  • .NET企业级应用架构设计系列之开场白
  • @angular/cli项目构建--Dynamic.Form
  • @RequestMapping用法详解