首页 > 其他分享 >systemtap embedded C 踩坑笔记

systemtap embedded C 踩坑笔记

时间:2024-09-28 14:13:18浏览次数:8  
标签:task struct embedded var2 STAP 笔记 sibling systemtap path

官方文档:
https://sourceware.org/systemtap/langref/3_Components_SystemTap_scri.html#SECTION00045000000000000000

打印

systemtap的embedded C中,不能#include <stdio.h>,也不能用printf和print。那怎么打印呢?用STAP_PRINTF。用法与printf一样。

还可以访问cript中的全局变量。
官方文档中的示例:

global var
global var2[100]
function increment() %{
    /* pragma:read:var */ /* pragma:write:var */
    /* pragma:read:var2 */ /* pragma:write:var2 */
    STAP_GLOBAL_SET_var(STAP_GLOBAL_GET_var()+1); //var++
    STAP_GLOBAL_SET_var2(1, 1, STAP_GLOBAL_GET_var2(1, 1)+1); //var2[1,1]++
%}

注意function中头两行的注释不能删。具体意义看文档。

返回

获取一个task_struct的sibling的函数这样写:

function GetSibling(task:long) %{
	struct task_struct *task = (struct task_struct*)STAP_ARG_task;
	return list_entry(task->sibling.next, struct task_struct, sibling);
%}

报错:

include/linux/kernel.h:908:41: 错误:expected ‘;’ before ‘(’ token
 #define container_of(ptr, type, member) ({   \
                                         ^
include/linux/list.h:374:2: 附注:in expansion of macro ‘container_of’
  container_of(ptr, type, member)
  ^
/tmp/stapcGCPg6/stap_8142d625ec4d0f2acc7a14543f578111_12083_src.c:1416:9: 附注:in expansion of macro ‘list_entry’
  return list_entry(task->sibling.next, struct task_struct, sibling);
         ^
/tmp/stapcGCPg6/stap_8142d625ec4d0f2acc7a14543f578111_12083_src.c: 在文件作用域:
cc1: 错误:无法识别的命令行选项“-Wno-tautological-compare” [-Werror]

看起来好像是编译器出错了。
但是原因其实是embedded C不能写return,要写STAP_RETURN。
所以要改成这样:

function GetSibling(task:long) %{
	struct task_struct *task = (struct task_struct*)STAP_ARG_task;
	STAP_RETURN(list_entry(task->sibling.next, struct task_struct, sibling));
%}

打印路径

可以用d_path把struct path解析为绝对路径。centos 7中d_path的声明如下:

// include/linux/dcache.h
extern char *d_path(const struct path *, char *, int);

其中char*是buffer的首地址,int是buffer的大小。
注意,d_path的返回值并不是传进去的buffer。直接输出buffer会输出空串。。。

正确用法示例:

static char full_path[BUFFER_SIZE];
STAP_PRINTF("%s\n", d_path(&(f->f_path), full_path, BUFFER_SIZE));

错误用法示例:

static char full_path[BUFFER_SIZE];
d_path(&(f->f_path), full_path, BUFFER_SIZE);
STAP_PRINTF("%s\n", full_path);

标签:task,struct,embedded,var2,STAP,笔记,sibling,systemtap,path
From: https://www.cnblogs.com/searchstar/p/18437900

相关文章

  • sql学习笔记
    DDL各种数据类型mysql数据类型decimal参考:https://blog.csdn.net/qq_38228254/article/details/88374713decimal(a,b) a指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。 b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从0到a之间......
  • RISC-V学习笔记
    文档介绍:https://www.cnblogs.com/mikewolf2002/p/9654946.html中文手册:http://crva.ict.ac.cn/documents/RISC-V-Reader-Chinese-v2p1.pdf所有立即数都被拓展成32位。opcode指定总体功能,同时决定了指令格式。funct指定了具体的小功能。压缩指令集......
  • xv6踩坑笔记
    lazyallocationtestpgbug:FAILED在系统调用函数(如sys_pipe)中,检测到致命错误(例如访问非法内存)时,不能直接用p->killed=1,而是要return-1。mmapscause0x000000000000000d(loadpagefault)sepc=0x0000000080007bb0stval=0x0000000000000000PANIC:kerneltrapgdb调试......
  • numpy学习笔记
    官方文档:https://numpy.org/doc/stable/numpy.array从pythonlist创建np.array([1,2,3])从多个pythonlist创建一维数组如果是确定数量的list,可以用np.concatenate:a=[1,2,3]b=[4,5,6]np.concatenate((a,b))输出:array([1,2,3,4,5,6])来源:https://stac......
  • 量子计算机学习笔记
    qubit经典的bit的状态空间为2,要么是0,要么是1。但是qubit可以同时是0和1,其状态空间可以看作是一个半径为1的球面,如下图Blochsphere所示。图片来源:https://en.wikipedia.org/wiki/Bloch_sphere可见,与直觉不同,它有两个自由度。为了简化,将其记为下面的形式:图片来源:http://www......
  • 系统集成项目管理工程师笔记1 - 第一章 信息化发展
    基础知识第一章信息化发展1.1信息与信息化1.1.1信息基础信息物质、能量以及其属性的标示的集合,是确定性的增加。以物质介质为载体,传递和反映世界各种事物存在方式、运动状态等的表征。信息不是物质,也不是能力。以一种普遍形式,表达物质运动规律,在客观世界中大量存在、产......
  • 可视化对话树编辑笔记
    在制作RPG甚至AVG的时候,我们要涉及大量的文本编辑,这个时候不可视化的界面会大大提升项目的维护成本(非常好脚本,使我AVG项目崩溃),所以我们需要自己创建一个文本编辑界面。而在涉及对话的时候,这个叫做对话树的结构具有不错的性质,对话树是一个简单的多叉树结构,但节点被分为CP......
  • SpringBoot笔记
    类的封装类的封装//使用注解自动生成Setter、Getter、toString、无参构造函数、全参构造函数@Data@NoArgsConstructor@AllArgsConstructorpublicclassEmp{privateIntegerid;//IDprivateStringusername;//用户名privateStringpassword;//密码......
  • 笔记篇 SSH密钥泄露&&提权&&溢出&&服务发现
    首先启动我们的靶机和KALI(需要靶机环境请在本篇留言或私信作者)首先在KALI输入ifconfig查看网段此处为80网段接着输入netdiscover -r 192.168.80.1/24 <IP/子网掩码>除去192.168.80.1网关和192.168.80.2我们对剩下的进行ping检测192.168.80.254丢包192.168.80.......
  • prometheus学习笔记之node-export
    1.安装node-exportk8s各node节点使⽤⼆进制或者daemonset⽅式安装node_exporter,⽤于收集各k8snode节点宿主机的监控指标数据,默认监听端⼝为9100wgethttps://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gztarxfno......