使用ebpf的bcc工具对Linux内核和程序进行跟踪1: Linux跟踪
2022-12-15 19:5:58 Author: 奶牛安全(查看原文) 阅读量:10 收藏

在使用BCC之前,先了解一下当前Linux常用的跟踪技术。有很多技术可以来观察和跟踪,了解观察的边界和跟踪的能力有助于节省时间和克服挫败感。

下面是一些用来对分析技术和工具分类的术语:

  • 跟踪 - 基于事件的记录
    • BCC使用这种方式
    • 类似监听或事件转储
    • 可以运行小程序对跟踪的事件进行即时分析
  • 取样 - 取度量结果的子集创建目标的大致轮廓
    • Perf使用这种方式
    • 类似剖析
    • 与跟踪对比,有更低性能成本
  • 观察 - 通过观察来理解一个系统,并对达成这目标的工具分类
    • 依赖于理解一个目标系统或应用的收获
    • 可以使用跟踪/取样来达成目标
  • 可视化 - 观察或跟踪目标的能力
    • GDB提供代码执行的可视化能力
    • 动态跟踪无法对内联函数可视化
    • 静态跟踪可对内联函数可视化
  • 事件 - 软件里在探测点或跟踪点被命中时发通知的动作
    • 很粗略的定义,一个事件可以是命中一个函数,或函数里特殊分支,函数结束,或例程开始,等等
    • 用户基本上根据他们启用的探测/跟踪点以及触发的时间/地点来定义事件

跟踪术语

term

这张图实质上是对Linux跟踪的总体了解。需要注意的是,这并不是所有内容的完整列表,也不是每个跟踪前端都使用每个数据提取程序或数据源。

这系列不会详细介绍上图中的所有内容。相反,我们将重点介绍数据源,更具体地说,就是kProbe/kretProbeuProbe/uretProbe、内核跟踪点和USDT Probe。了解不同的数据源及其功能是了解跟踪前端功能的关键。例如,sysdigg不使用列出的任何数据源,并且只对系统调用可见。

值得一提的是BCC与上图的关系。以前所述,BCC是一个跟踪前端。跟踪前端是一个提供跟踪技术和功能的应用程序, 有时候还会像Perf一样提供采样。

追踪前端分为两类:底层前端和上层前端。上层前端通常是一种更加用户友好的跟踪工具套件,您可以使用它来快速观察目标。一些上层跟踪前端构建在底层前端之上,例如bpftrace基于BCC。底层跟踪前端通常比较简单,用户不太友好,开发人员需要做更多的工作才能充分利用它们。底层前端的好处是您可以更灵活地控制事件、数据处理和显示(尽管DTracebpftrace也可以提供一些这种灵活性和控制)。

BCC被认为是一种底层跟踪前端,因为我们需要写脚本去调用它。换句话说,没有像Dtracebpftrace之类的命令使用,我们需要使用自己的脚本。

BCC全称是BPF编译器集合。在上图的BPF数据抽取器就是BPFBPF为内核(通过kprobes/kretprobes,内核跟踪点)和用户态(通过uprobes/uretprobes,USDT probes)提供了可视化, 使得BCC变成一个完整灵活的前端。

动态和静态跟踪

我们接着要看的数据源是kprobes/kretprobes,内核跟踪点,uprobes/uretprobesUSDT probes。它们非常强大,同时根据它们静态和动态的能力分类。kprobes/kretprobesuprobes/uretprobes是动态跟踪技术,而内核跟踪点和USDT probes是静态跟踪技术。

动态跟踪 - 可以在运行的进程实时挂钩

  • kprobes/kretprobes:对内核函数动态挂钩
    • kprobes当被挂钩的内核函数开始执行时触发
    • kretprobes当被挂钩的内核函数返回时触发
  • uprobes/uretprobes - 对用户态的C函数实时挂钩
    • uprobes当被挂钩的用户态C函数开始执行时触发
    • uretprobes当被挂钩的用户态C函数返回时触发
  • 优点:零开销,不需要重新编译代码
  • 缺点:API变动了,需要重新找到相应符号,对内联函数无法跟踪

静态跟踪 - 在软件预先定义的跟踪点挂钩

  • 跟踪点在代码就已经定义和实现
  • 内核跟踪点:内核预先定义的跟踪点
    • Linux机器的内核跟踪点可以在/sys/kernel/debug/tracing/events查看
    • 添加新的内核跟踪点要放在include/trace/events
  • USDT probes 也叫用户静态定义跟踪点,也是代码预先定义。比如glibc__malloc_hook,__free_hook
    • 可以通过systemtap-sdt-dev的头文件和工具或自定义的头文件加入到应用程序
  • 优点:可以放在代码任意地方,包括内联函数,对变量高度可视化和稳定
  • 缺点:维护成本很高,增删跟踪点都需要重新编译和构建,重新回归测试

Linux跟踪的总结

有几种跟踪技术都可以和许多跟踪前端交互,最强大的莫过于kprobes/kretprobes,uprobes/uretprobes,内核跟踪点和用户态跟踪点。有一个同时使用静态和动态技术的跟踪前端,是用于观察系统的最佳选择。

记着:kprobesuprobes都是动态挂钩的,这意味着只要在生产环境有它们,只要打开并挂上相应函数就行了,这种方式的好处是零开销,劣势是对不同版本的软件,需要重新找到挂钩的函数。

而静态跟踪可以静态挂钩,意味着它们需要由开发者定义和实现。好处是就是接口稳定,对跟踪的数据类型可以很精准。不好的地方,增减跟踪点需要重新编译,这样会提高代码维护成本。

一个通用的建议是:先用静态跟踪,再用动态跟踪。

暗号:7e46c



文章来源: http://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247488110&idx=1&sn=58139c5db600b518c81c0e837b42fffb&chksm=fdf9797bca8ef06d0bf8e3678f63af11261f63be89910dc5fce2c025e363795da2f01a4eaf3a#rd
如有侵权请联系:admin#unsafe.sh