You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04.2下Systemtap编译错误:proc_set_user静态声明冲突

解决SystemTap编译阶段proc相关声明冲突与结构体成员未定义问题

问题场景

内核版本5.19.0-32-generic,已按Ubuntu官方教程完成SystemTap安装、内核调试符号配置,因启用SecureBoot搭建本地编译服务器。执行sudo stap -l 'syscall.*' --use-server=localhost可正常列出系统调用,但运行简单探针命令sudo stap -e 'probe begin {exit()}' --use-server=localhost时,在编译生成C代码阶段出现两类错误:

  • proc_set_user和proc_remove的静态声明与内核头文件中的非静态声明冲突
  • 访问struct proc_dir_entry成员时提示类型未定义

可能原因

  1. SystemTap版本与5.19内核的procfs API变更不兼容:5.15+内核调整了procfs相关函数的静态属性,同时struct proc_dir_entry的成员可见性、定义方式发生变化,当前使用的SystemTap版本未同步适配这些内核改动。
  2. 编译服务器的内核头文件/调试符号与本地运行内核不完全匹配:即便指定了同版本编译器,若编译服务器未安装对应内核的完整调试头文件,会导致代码生成时引用的声明与实际内核不一致。
  3. SystemTap编译缓存干扰:旧的生成代码缓存未清理,导致新编译时复用了适配旧内核的代码片段。

解决方案

1. 升级SystemTap到适配5.19内核的版本

若Ubuntu仓库提供的SystemTap版本过旧(低于4.8),直接从官方源码编译最新稳定版:

# 安装编译依赖
sudo apt-get install build-essential elfutils libelf-dev libdw-dev
# 下载最新稳定版源码(以4.9为例)
wget https://sourceware.org/systemtap/ftp/releases/systemtap-4.9.tar.gz
tar xzf systemtap-4.9.tar.gz
cd systemtap-4.9
# 编译安装,指定内核头文件路径
./configure --with-kernel-dir=/usr/src/linux-headers-5.19.0-32-generic
make && sudo make install

2. 确保编译服务器内核环境与本地完全一致

在编译服务器上安装对应版本的内核头文件和调试符号包:

sudo apt-get install linux-headers-5.19.0-32-generic linux-image-5.19.0-32-generic-dbgsym

执行探针时明确指定内核头文件路径:

sudo stap -e 'probe begin {exit()}' --use-server=localhost --kernel-dir=/usr/src/linux-headers-5.19.0-32-generic

3. 清理SystemTap编译缓存

删除临时缓存目录,避免旧代码干扰:

sudo rm -rf /tmp/stap*

4. 手动适配procfs相关模板(进阶)

若升级版本仍无法解决,修改SystemTap的proc相关模板文件:

  • 找到SystemTap安装目录下的tapset/linux/proc.stp或对应的C模板(通常在/usr/share/systemtap/tapset/或/usr/local/share/systemtap/tapset/)
  • 将proc_set_user和proc_remove的静态声明改为非静态,对齐内核头文件的定义
  • 对于struct proc_dir_entry成员访问错误,替换为内核提供的辅助函数(比如使用proc_create_data等官方API而非直接操作结构体成员)

内容的提问来源于stack exchange,提问作者WKstraw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:20:16