我是靠谱客的博主 灵巧大门,最近开发中收集的这篇文章主要介绍bpftrace:简便输出调试信息,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

bpftrace是一种用于Linux增强型伯克利包过滤器(eBPF)的高级跟踪语言,使用LLVM作为后端将脚本编译为BPF字节码,并利用BCC与Linux BPF系统进行交互,以及现有的Linux跟踪功能:内核动态跟踪(kprobes)、用户级动态跟踪(uprobes)、和跟踪点(tracepoint)。bpftrace语言的灵感来自awkh、C、DTrace和SystemTap等前身跟踪器。
上一篇<<tracepoint: 定义函数及调用示例>>实现了tracepoint定义及函数调用,本篇也以这个示例和官方提供示例为基础讲述。

目录


1. 基本用法
1.1 自实现tracepoint输出
1.2 简单示例
2. 指令分析
2.1 查询所有函数
2.2 其它指令
2.3 输出参数


内容


1. 基本用法

bpftrace项目在github的地址

1.1 自实现tracepoint输出

  上一篇<<tracepoint: 定义函数及调用示例>>中,定义test_trace函数,现在我们编写bpftrace语句:

bpftrace -e 'tracepoint:test_trace:test_trace { printf("%s, %dn", comm, args->pid) }'

  语句执行后,执行write函数(触发trace_*函数):

echo 123456 > /dev/test

在这里插入图片描述
  参考上图,使用bpftrace确实比较省事。


1.2 简单示例

  进程打开的文件,输出当前调用

bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %sn", comm, str(args->filename)); }'

  系统调用计数(按程序)

bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'

  按进程读取字节

bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret/ { @[comm] = sum(args->ret); }'

  按进程读取大小分布

bpftrace -e 'tracepoint:syscalls:sys_exit_read { @[comm] = hist(args->ret); }'

  显示每秒系统调用率

bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @ = count(); } interval:s:1 { print(@); clear(@); }'

  按进程跟踪磁盘大小

bpftrace -e 'tracepoint:block:block_rq_issue { printf("%d %s %dn", pid, comm, args->bytes); }'

  按进程计算页面错误

bpftrace -e 'software:faults:1 { @[comm] = count(); }'

  按进程名称和 PID 计算 LLC 缓存未命中数(使用 PMC)

bpftrace -e 'hardware:cache-misses:1000000 { @[comm, pid] = count(); }'

  以 99 赫兹(hz)为 PID 189 配置用户级堆栈

bpftrace -e 'profile:hz:99 /pid == 189/ { @[ustack] = count(); }'

  为根 cgroup-v2 中的进程打开的文件

bpftrace -e 'tracepoint:syscalls:sys_enter_openat /cgroup == cgroupid("/sys/fs/cgroup/unified/mycg")/ { printf("%sn", str(args->filename)); }'

2. 指令分析

2.1 查询所有函数

  查询函数指令:

bpftrace  -l

  每条数据有三部分组成,跟踪功能:类型(文件):函数名称

tracepoint:syscalls:sys_enter_open
tracepoint:syscalls:sys_exit_open
tracepoint:syscalls:sys_enter_openat
tracepoint:syscalls:sys_exit_openat
tracepoint:syscalls:sys_enter_creat
tracepoint:syscalls:sys_exit_creat
tracepoint:test_trace:test_trace
... 

  清楚需要调用的函数名称时(如test_trace),直接使用bpftrace -l | grep test_trace。


2.2 其它指令

  -B MODE 输出缓冲模式(‘line’、‘full’ 或 ‘none’)

  -d 调试信息运行

  -dd 详细调试信息运行

  -e ‘program’ 执行这个程序

  -h 显示此帮助信息

  -l [search] 列出探测

  -p PID 在PID上启用USDT探测

  -c ‘CMD’ 运行CMD并在结果进程上启用USDT探测

  -v 详细消息

  --version bpftrace版本


2.3 输出参数

  使用bpftrace -d(或-dd) -e 并在printf里指定输出一个结构函数,执行指令可以看到输出结构体定义,如:

bpftrace -d -e 'tracepoint:test_trace:test_trace { printf("%s", str(args->filename)) }'

||
/

#include <linux/types.h>
struct _tracepoint_test_trace_test_trace
{
  unsigned short common_type;
  unsigned char common_flags;
  unsigned char common_preempt_count;
  int common_pid;
  char comm[16];
  pid_t pid;
};

  这里指定了str(args->filename),输出字符串文件名称,执行指令可以看到结构体列表。(filename参数不正确,但也能打印出结构体列表,获得相关参数即可)

最后

以上就是灵巧大门为你收集整理的bpftrace:简便输出调试信息的全部内容,希望文章能够帮你解决bpftrace:简便输出调试信息所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部