给kprobe添加字符数据显示方式

简介: 给kprobe添加字符数据显示方式

目前kprobe不支持单个字符的输出显示方式,下面的patch给kprobe增加了一种%c的数据显示方式:

From aafaf9fde1e72fb734a48840645ec43dce56661d Mon Sep 17 00:00:00 2001
From: Donglin Peng <dolinux.peng@gmail.com>
Date: Tue, 13 Dec 2022 00:56:20 -0800
Subject: [PATCH] tracing/probe: add a char type to print the character value
 of traced arguments
There are scenes that we want to show the character value of traced
arguments other than a decimal or hexadecimal or string value for debug
convinience. Add a new type named 'char' to do it.
For example:
echo 'p:myprobe xxxx $arg1:char' > kprobe_events
Signed-off-by: Donglin Peng <dolinux.peng@gmail.com>
---
 Documentation/trace/kprobetrace.rst | 3 ++-
 kernel/trace/trace_probe.c          | 2 ++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/Documentation/trace/kprobetrace.rst b/Documentation/trace/kprobetrace.rst
index 4274cc6a2f94..007972a3c5c4 100644
--- a/Documentation/trace/kprobetrace.rst
+++ b/Documentation/trace/kprobetrace.rst
@@ -58,7 +58,7 @@ Synopsis of kprobe_events
   NAME=FETCHARG : Set NAME as the argument name of FETCHARG.
   FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
      (u8/u16/u32/u64/s8/s16/s32/s64), hexadecimal types
-     (x8/x16/x32/x64), "string", "ustring" and bitfield
+     (x8/x16/x32/x64), "char", "string", "ustring" and bitfield
      are supported.
   (\*1) only for the probe on function entry (offs == 0).
@@ -80,6 +80,7 @@ E.g. 'x16[4]' means an array of x16 (2bytes hex) with 4 elements.
 Note that the array can be applied to memory type fetchargs, you can not
 apply it to registers/stack-entries etc. (for example, '$stack1:x8[8]' is
 wrong, but '+8($stack):x8[8]' is OK.)
+Char type can be used to show the character value of traced arguments.
String type is a special type, which fetches a "null-terminated" string from
 kernel space. This means it will fail and store NULL if the string container
 has been paged out. "ustring" type is an alternative of string for user-space.
diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c
index 36dff277de46..a4abf7f6c295 100644
--- a/kernel/trace/trace_probe.c
+++ b/kernel/trace/trace_probe.c
@@ -50,6 +50,7 @@ DEFINE_BASIC_PRINT_TYPE_FUNC(x8,  u8,  "0x%x")
DEFINE_BASIC_PRINT_TYPE_FUNC(x16, u16, "0x%x")
DEFINE_BASIC_PRINT_TYPE_FUNC(x32, u32, "0x%x")
DEFINE_BASIC_PRINT_TYPE_FUNC(x64, u64, "0x%Lx")
+DEFINE_BASIC_PRINT_TYPE_FUNC(char, u8, "%c")
 int PRINT_TYPE_FUNC_NAME(symbol)(struct trace_seq *s, void *data, void *ent)
 {
@@ -93,6 +94,7 @@ static const struct fetch_type probe_fetch_types[] = {
  ASSIGN_FETCH_TYPE_ALIAS(x16, u16, u16, 0),
  ASSIGN_FETCH_TYPE_ALIAS(x32, u32, u32, 0),
  ASSIGN_FETCH_TYPE_ALIAS(x64, u64, u64, 0),
+ ASSIGN_FETCH_TYPE_ALIAS(char, u8, u8,  0),
  ASSIGN_FETCH_TYPE_ALIAS(symbol, ADDR_FETCH_TYPE, ADDR_FETCH_TYPE, 0),
  ASSIGN_FETCH_TYPE_END
-- 
2.25.1

下面是使用方法:

echo 'p:test_bpf1 test_bpf_dump name=+0(+8($arg1)):string name_c8=+0(+8($arg1)):char name_c8_array=+0(+8($arg1)):char[6]' > kprobe_events

下面是trace输出:

#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |
            bash-431     [003] .....  1616.184892: test_bpf1: (test_bpf_dump+0x0/0x65) name="bpf1" name_c8=b name_c8_array={b,p,f,1,,}

目前这个patch已经合入社区:

相关文章
|
12月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
219 7
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
295 4
|
11月前
|
人工智能 自然语言处理 物联网
llama factory 从数据集起步 跑通 qwen系列开源生成式大模型 微调
`dataset_info.json` 文件用于管理 llama factory 中的所有数据集,支持 `alpaca` 和 `sharegpt` 格式。通过配置此文件,可以轻松添加自定义数据集。数据集的相关参数包括数据源地址、数据集格式、样本数量等,支持 Hugging Face 和 ModelScope 两个平台的数据集仓库。针对不同格式的数据集,提供了详细的配置示例,如 `alpaca` 格式的指令监督微调数据集、偏好数据集等,以及 `sharegpt` 格式的多模态数据集等。今天我们通过自定义数据集的方式来进行qwen2.5_14B_instruct模型进行微调
4507 7
|
人工智能 安全 Linux
人工智能时代下,国产服务器操作系统如何加快发展?
【4月更文挑战第3天】人工智能时代下,国产服务器操作系统如何加快发展?
|
存储 固态存储 Unix
Linux中磁盘分区和文件系统管理
在Linux系统中,磁盘是存储数据的物理设备,如HDD或SSD,以文件形式存在于`/dev`目录下,如`sda`、`sdb`等。文件系统定义了如何在磁盘上组织和访问数据,常见的Linux文件系统有ext2、ext3、ext4、xfs等。通过虚拟机软件如VMware,用户可以向Linux虚拟机添加新的硬盘。
229 1
|
存储 C语言 C++
实战C++:如何开发一个完整的学生信息管理系统?
先简单介绍一下这篇文章,这是一篇关于C++的学生管理系统的文章,作为从C语言到C++过渡的项目。
421 0
|
SQL 监控 测试技术
PTS压测问题之token值不一样配置如何解决
PTS(Performance Testing Service)是一项面向网站、应用等提供的压力测试服务,用于模拟不同场景下的用户访问,评估系统的性能表现;在进行PTS压测时,可能会出现一些异常或报错,本合集将PTS压测中频繁出现的问题及其解决办法进行汇编,旨在帮助用户更有效地进行性能测试和问题定位。
457 1
|
JavaScript API
onbeforeunload事件之关闭浏览器之前的提示弹框
onbeforeunload事件之关闭浏览器之前的提示弹框
800 0
|
存储
【二叉树】——链式结构(快速掌握递归与刷题技巧)
【二叉树】——链式结构(快速掌握递归与刷题技巧)
270 0
|
XML Java 测试技术
Spring5学习(三):简单测试Spring的基本功能
今天开始学习Sping5,源码里面有很多值得学习的思想。 从最简单开始,今天先简单测试一下Sping的功能。
208 0
Spring5学习(三):简单测试Spring的基本功能