本作品采用知识共享署名-非商业性使用-相同方式共享 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. TiDB适用和不适用场景
  3. 也来玩玩MongoDB
  4. 九点标定进行仿射变换halcon仿真代码
  5. andriod开发中的几个基本概念及关系SDK ADT Platform API
  6. 存放哪些内容 项目中vuex_房屋安全鉴定中房屋抗震检测内容有哪些
  7. Spring结合Quartz实现多任务定时调用(转载)
  8. python中元组和列表的区别_Python 序列:列表、元组
  9. matplotlib学习日记(八)----完善统计图
  10. 第一章:操作系统引论
  11. 大数据面试杀招——Hadoop高频考点,正在刷新你的认知!
  12. 软件成分分析(SCA)完全指南
  13. 【函数】- 如何在C++中求平方根?
  14. 计算机机房需要装排烟风机不,送风机房和排烟机房的作用分别是什么
  15. 什么是DDL?其含义及其常用命令解析
  16. windows自带hyperv安装虚拟机ubuntu与分辨率修改
  17. beeline : Error: Could not open client transport with JDBC 连接失败
  18. 850是什么意思_【铲车850代表什么意思】专区-850-铲车-铁甲网
  19. 小鸟飞行c语言报告,C/C++编程笔记:飞翔的小鸟(Flappy Bird)——C语言版本
  20. 大龄程序员~聊聊我毕业十年的生活

热门文章

  1. 网页设计html 模拟试题
  2. 注册测绘师学习笔记(五)
  3. Windows上最好用的5款epub阅读器
  4. 选股策略之MACD指标选股
  5. 非controller层调用service2种
  6. Python批量修改文件名解决TinyMediaManager 刮削动漫错误的问题
  7. myql 查询树形表结果:说说、说说的评论、评论的回复
  8. 简单操作阿里云盘秒变电脑本地硬盘使用!秒多1T内存
  9. 织梦dedecms会员中心投稿,管理员审核后,文档稿件动态浏览,禁止生成静态页
  10. 最全curl命令总结【详解】