本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。

引言

USDT的全称是user-level statically defined tracing,是一种在用户态中埋点,以支持动态追踪的方案,埋点的优点基本可以阐述为以下三点:

  1. 防止inline而导致无法监测到函数
  2. 随版本迭代接口功能可以保证没有变化
  3. 在不进行追踪时插入一条nop指令,在进行追踪时替换为int3。在不追踪时最大程度节省性能,代价只是一条nop和elf文件中多一个NOTE段,其中存储着probe的一些偏移信息。

不过目前这种USDT的埋点方案我还没有找到如何在SystemTap去使用([3]中描述量一种情况),[1]中描述了systemTap中usdt的使用,我们这篇来看一看如何在bpfTrace中使用USDT,这里我们使用Folly中的Traceing工具(folly/tracing)去实现需求,这里其实Folly中只用到了StaticTracepoint-ELFx86.hStaticTracepoint.h这两个文件而已,所以我们完全可以把这两个文件直接拷贝到我们的项目中,使得项目原生支持USDT。

例子

我们先看一个简单的例子:

#include "StaticTracepoint.hpp"
#include <unistd.h>int main() {sleep(5);int one = 10;int two = 20;for (size_t i = 0; i < 100; i++) {one = two = i;TRACING_SDT(lizhaolong, yunwenqi, one, two);}sleep(10000);return 0;
}

执行如下指令g++ -fno-omit-frame-pointer -O0 -g main.cpp,然后我们gdb进去看看汇编,执行disassemble /m main就可以看到函数对应的源码和汇编了:

我们可以看到bpfTrace没有开始追踪时,这个地方是一条空指令,因为StaticTracepoint-ELFx86.h中插入汇编时有一条__volatile__,所以这个nop指令也不会被优化。

当我们把bpfTrace挂上时,即执行如下指令sudo bpftrace -e 'usdt:/home/lizhaolong.lzl/usdt/a.out:lizhaolong:yunwenqi {printf("%d %d\n", arg0, arg1)}',我们可以看到这样的输出:

此时gdb进去,可以看到如下显示:

这里其实就是去利用uprobes去执行动态追踪了。

我们也可以在elf文件中看到probe已经存在的证据:

好巧不巧,这里的Location的偏移就是我们设定的probe的起始地址,后面还有后面要提的信号量的偏移。


除了正常的埋点意外,还可以把代码写成下面这样:

#include "StaticTracepoint.hpp"
#include <unistd.h>// 必须放到全局变量处,这是一个信号量的声明,有extern "C" 前缀
TRACING_SDT_DEFINE_SEMAPHORE(lizhaolong, yunwenqi)int main() {sleep(5);int one = 10;int two = 20;for (size_t i = 0; i < 100; i++) {one = two = i;if (TRACING_SDT_IS_ENABLED(lizhaolong, yunwenqi)) {one *= 10;two *= 10;TRACING_SDT_WITH_SEMAPHORE(lizhaolong, yunwenqi, one, two);}}sleep(10000);return 0;
}

其实就是可能在把参数传向probe时可能需要做一些处理,这些处理可能是比较昂贵的,所以自然没有被追踪时我们不希望这些代码被执行,此时可以设定一个信号量,在被追踪时才被设置,其实本质就是一个volatile unsigned short


我们可以看到信号量的地址其实已经是写在elf文件中了的。此时我们用一个if判断跳过了昂贵的参数处理过程。

参考:

  1. https://github.com/agentzh/usdt-sample
  2. https://github.com/facebook/folly
  3. Adding User Space Probing to an Application (heapsort example)

在bpfTrace中使用USDT相关推荐

  1. LTTng中使用USDT

    我记得之前找到个什么指令,可以查看很多当前板子里有的好像是probe的类型.但是当时我发现板子里只有kernel的没有userspace的然后就没继续了.后来竟然忘了. 现在苦苦寻找LTTng使用US ...

  2. perf基本使用与简单介绍

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 perf简单介绍 ...

  3. BPF和Go:在Linux中内省的现代方式[译]

    本文翻译自马可·凯瓦克(Marko Kevac)的<BPF and Go: Modern forms of introspection in Linux>[1](https://mediu ...

  4. 强劲的Linux Trace工具:bpftrace (DTrace 2.0) for Linux 2018

    Original:阿里 姜弋内核月谈 译者: 姜弋 译者注:原作者是大名鼎鼎的性能分析专家:Brendan Gregg,现在工作在Netflix,之前工作在Sun,在Sun公司的时候,他就做了大量的性 ...

  5. BPF之前端工具BCC与bpftrace

    BPF前端工具BCC与bpftrace 一.概述 BCC和bpftrace到底是什么,与BPF是什么关系呢? 经过上一篇的介绍,BPF是内核中的执行引擎,BCC和bpftrace则是两个前端工具,比如 ...

  6. 什么是USDT以及如何使用它?

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 什么是USDT? 如果您使用Poloniex或Bittrex交易所交易,那么您可能已经多次见过UDST市场了,您甚至经常 ...

  7. Linux内核跟踪eBPF:bpftrace 参考指南

    bpftrace Reference Guide 推荐阅读:Linux内核跟踪eBPF:bpftrace一行教程 For a reference summary, see the README.md ...

  8. 舍 bpftrace 而取 systemtap 的代价和思考

    作者 | dog250  责编 | 张文 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 上个礼拜我就想喷 eBPF 了,由于周末时间实在太紧,就准备拖延一周,但还是 ...

  9. 稳定币usda是哪个发行的_稳定币USDT的“发行”和“印刷”有什么区别?

    USDT,是Tether发行的稳定币,与美元USD挂钩,1USDT约等于1美金.之所以称之稳定,是因为它的价格波动性较低,Tether公司对外称将严格遵守1:1准备金保证,每发行1USDT,其银行账户 ...

最新文章

  1. 降低数值精度以提高深度学习性能
  2. Adobe源码泄漏?3行代码搞定,Flash动画无缝导入Android/iOS/cocos2dx(一)
  3. R语言使用compareGroups包compareGroups函数生成表统计表、createTable函数创建二元表、并导出结果到文档(doc、csv、xlsx、pdf)
  4. 快速排序(quick sort) C++
  5. 启动欢迎页面时,Android Studio设置全屏Activity
  6. 如何把ajax改成同步请求,如何将Ajax请求从异步改为同步
  7. 宽客的人amp;amp;事件映射
  8. 配置linux系统ip,Linux系统IP地址配置
  9. 「leetcode」383. 赎金信:哈希表的经典题目
  10. 从维基百科到裴松之注三国志
  11. 软件测试--移动应用主要针对软测比赛(教程)
  12. 华为荣耀android进入,EMUI 9.1公测招募开启 华为荣耀14款机型获支持
  13. php silk文件转换pcm,微信语音silk格式文件转换处理记录
  14. win7和ubuntu18.04安装双系统详细教程
  15. 七夕礼物送什么给男朋友好?七夕礼物清单
  16. jQuery 用click() 失效,不起作用,直接父级使用on事件委托不好使
  17. echarts java导出功能_echarts图表导出excel示例
  18. 后台启动zookeeper
  19. Python — matplotlib.pyplot 绘图模块及常用函数
  20. 视频教程-10分钟实现微信小程序支付功能-微信开发

热门文章

  1. 一个CPP程序猿的第一篇博客
  2. P2PSIP 技术专业博客
  3. c语言作业做出金山打字功能,C语言小游戏之金山打字
  4. Manjaro Linux安装ROS2 humble机器人系统:从开始到安装完成
  5. 金油早指导3.25黄金原油独家策略,预测今日黄金白银td冲高回落
  6. oracle数据库 移动,在ORACLE中移动数据库文件
  7. [PL/SQL] 请教大家一个问题,存储过程中需要几个commit?
  8. 安卓pdf阅读器_安卓6.0+2GB+32GB支持手写!BOOX Nova Pro电子书阅读器隆重上市
  9. SWA(Stochastic Weight Averaging)实验
  10. 爱奇艺微服务标准技术架构实践