strace交叉编译后对特定文件的写流程进行监控和过滤
交叉编译
为了支持strace对pid进行解析,因系统默认支持的strace版本较低,需要使用较新的版本对strace进行交叉编译,这里使用了github上的 https://github.com/strace/strace/releases 发布的strace v5.19版本,2022-08-12发布。log中说明包含了对prctl调用的解析。从log来看strace 5.14版本就已经引入了prctl解析的支持。
Improvements
...Enhanced prctl syscall decoding.
...
基于该版本的源码对strace进行了交叉编译。编译过程中遇到了与mpers相关的报错.
print_fields.h:246:3: note: in expansion of macro 'PRINT_VAL_U'PRINT_VAL_U((where_).field_); \^~~~~~~~~~~
printsiginfo.c:225:5: note: in expansion of macro 'PRINT_FIELD_U'PRINT_FIELD_U(*sip, si_pkey);^~~~~~~~~~~~~
Makefile:3709: recipe for target 'libmpers_m32_a-printsiginfo.o' failed
make[3]: *** [libmpers_m32_a-printsiginfo.o] Error 1
Makefile:2710: recipe for target 'all' failed
make[2]: *** [all] Error 2
configure时选择禁用mper。成功交叉编译并在设备上执行。
./configure --host=aarch64-openwrt-linux --enable-mpers=no
放到设备上执行,成功获得较新版本v5.19 的strace 的可执行文件。
# ./strace --version
strace -- version 5.19
Copyright (c) 1991-2022 The strace developers <https://strace.io>.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Optional features enabled: no-m32-mpers
监控流程
strace的基本使用场景是监控系统调用,但是默认的场景下,大量的系统调用,及其参数的打印,会占用大量的系统资源,在实际生产环境中的使用是不太适用的。如下使用方式,实现了监控进程向特定文件输出的内容,过滤无效内容,并基于输出内容再进行二次过滤,有效控制了strace跟踪对cpu的占用。
针对特定文件的写流程,我们也采取对路径进行过滤的方式,同时仅捕获write系统调用,同时通过-qqq选项和-e signal 去除无效的输出打印。通过如下方式启动strace对目标进程对特定文件的读写进行监控。
# ./strace -qqq -f -P /path/to/monitor -e signal=none -e trace=write -y -Y -p $pid
下面我们将该流程应用在一个实际的程序中,并观察其输出。
如下是我们监控的进程的源文件,其模拟启动一个线程,打开一个源文件,并在一段时间后对这个文件进行读写,先后进行4次读写,我们假定默认是进行18字节的读写,然后其中有一次进行了非18字节的读写,希望把这次读写过滤出来,认为是异常的读写。
void * worker_thread1(void * pArg){prctl(PR_SET_NAME, "thread1");FILE * fp = NULL;fp = fopen("/path/to/strace/test","w+");sleep(5);fwrite("test write 1 end \n",1,18,fp);fflush(fp);fwrite("test write 2 end \n",1,18,fp);fflush(fp);fwrite("test write 300 end \n",1,10,fp);fflush(fp);fwrite("test write 4 end \n",1,18,fp);fflush(fp);fclose(fp);return NULL;
}int start_thread(){pthread_t tid ;pthread_attr_t threadattr;pthread_attr_init(&threadattr);pthread_create(&tid,&threadattr,worker_thread1,NULL);
}int main(){start_thread();sleep(10);return 0 ;
}
如下是在执行这个进程后,对其输出结果基于grep进行过滤,并重定向到a.log文件中,展示a.log文件中的内容。
$ ./a.out &
[1] 12876$ strace -qqq -f -e signal=none -e trace=write -P /path/to/strace/test -e decode-pids=comm -p 12876 2>&1 |grep -v "18)" > a.log$ cat a.log
[pid 12877<thread1>] write(3, "test write", 10) = 10
我们再看下如果没有基于grep进行过滤的输出结果。
$ strace -qqq -f -e signal=none -e trace=write -P /path/to/strace/test -e decode-pids=comm -p 12865 2>&1
[pid 12866<thread1>] write(3, "test write 1 end \n", 18) = 18
[pid 12866<thread1>] write(3, "test write 2 end \n", 18) = 18
[pid 12866<thread1>] write(3, "test write", 10) = 10
[pid 12866<thread1>] write(3, "test write 4 end \n", 18) = 18
[1]+ Done ./a.out
补充说明
strace命令选项说明
这里对上述流程中使用的strace命令的具体含义做一个简单的说明。
-qqq, --quiet=allsuppress all suppressible messages.
//抑制所有可抑制的辅助打印信息
-f, --follow-forksfollow forks
//跟踪所有子进程
-P PATH, --trace-path=PATHtrace accesses to PATH
//跟踪访问特定的路径的系统调用
-y, --decode-fds[=path]print paths associated with file descriptor arguments
//解析文件描述符到路径进行展示
-Y, --decode-pids=commprint command names associated with PIDs
//解析进程id为comm,comm一般是通过prctl配置。
-p PID, --attach=PIDtrace process with process id PID, may be repeated
//跟踪特定的执行中的指定pid的进程。
-e // -e表示expression,后面可以对应多种类型的表达式。-e trace=SYSCALL
//跟踪trace指定的系统调用。可以是特定系统调用,也可以是某一类系统调用。-e signal=SET, --signal=SET
//设定 -e signal=none 就可以忽略所有的信号。
-o FILE, --output=FILEsend trace output to FILE instead of stderr
//指定输出到文件而不是stderr标准错误输出。在结尾对标准错误的输出进行管道重定向。
2>&1
//基于描述符的读写过滤表达式,需要注意的是,-e write=set选项能够输出的前提是对应的write系统调用有被捕获。
//所以其实这个输出结果是和write系统调用的输出结果相重叠的。
-e write=set (监控文件描述符的输出)
-e read=set (监控文件描述符)
--read=set 从特定文件描述符中读取出来的内容,输出。
参考文档
https://www.man7.org/linux/man-pages/man1/strace.1.html
相关文章:
strace交叉编译后对特定文件的写流程进行监控和过滤
交叉编译 为了支持strace对pid进行解析,因系统默认支持的strace版本较低,需要使用较新的版本对strace进行交叉编译,这里使用了github上的 https://github.com/strace/strace/releases 发布的strace v5.19版本,2022-08-12发布。lo…...
初识网络之TCP网络套接字
目录 一、TCP常用网络接口 1. 监听服务器 2. 接收链接 3. 发起连接 二、实现一个简单的tcp程序 1. 日志函数 2. 服务端文件 2.1 .hpp文件 2.2 .cpp文件 3. 客户端文件 3.1 .hpp文件 3.2 .cpp文件 4. 程序测试 三、实现支持多个用户并发访问的tcp程序 1. 当前程序…...
自然语言处理从入门到应用——自然语言处理的基本问题:文本分类(Text Classification, Text Categorization)
分类目录:《自然语言处理从入门到应用》总目录 文本分类(Text Classification, Text Categorization)是最简单也是最基础的自然语言处理问题。即针对一段文本输入,输出该文本所属的类别,其中,类别是事先定义…...
【论文】——Robust High-Resolution Video Matting with Temporal Guidance浅读
视频matting 时序监督 摘要 我们介绍了一种稳健、实时、高分辨率的人类视频抠图方法,该方法取得了新的最先进性能。我们的方法比以前的方法轻得多,可以在Nvidia GTX 1080Ti GPU上以76 FPS处理4K,以104 FPS处理HD。与大多数现有的逐帧作为独…...
第四章、用户体验五要素之范围层解析(本文作用是通俗讲解,让你更容易理解)
把用户需求和产品目标转换成特定的产品时应该提供给用户什么样的内容或者功能就变成了范围层。 范围层就是定义需求。如果不能很好的定义需求,那么你的软件永远都是测试待发布版本。如果产品只是负责人脑海中的一个不定型印象,那将是灾难性的。 1、产品负…...
计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现
文章目录 导文文章重点前言课题内容相关技术与方法介绍技术分析技术设计技术设计技术实现方面系统测试和优化总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现 文章重点 前言 本文介绍了一种基于Python的农业温室智…...
Java 进阶 -- 流
Java I/O, NIO, and NIO.2 BaseStream<T, S extends BaseStream<T, S>> extends AutoCloseable 流(streams)的基本接口,流是支持顺序和并行聚合操作的元素序列。下面的例子演示了一个使用流类型stream和IntStream的聚合操作,计算红色小部件…...
硬件 TCP/IP 协议栈
目录 全硬件的TCP/IP 协议栈简介以太网接入单片机方案以太网接口芯片CH395Q 简介以太网接口芯片CH395Q 命令简介以太网接口芯片CH395Q 寄存器配置与使用移植CH395Q 源码 TCP_Client 实验TCPClient 配置流程TCPClient 实验硬件设计程序设计下载验证 WebServer 实验WebServer 简介…...
word恢复和粘贴按钮变灰色,不可用怎么办?
如果 Word 中的恢复和粘贴按钮变成灰色,可能是由于以下原因之一: 1. 文档处于只读模式。 2. 与 Office 相关的某些组件已损坏或缺失。 3. Word 的文件权限被配置为只读。 以下是一些可能的解决方法: 1. 检查文档是否处于只读模式。 如果是…...
【unity技巧】Physics2D Raycast、Overlapcircle、OverlapBox检测的用法
文章目录 分析检测地面1. 使用Raycast1.1 介绍1.3 场景窗口可视化1.4 完整实例代码1.4 存在问题1.4.1 问题11.4.2 问题2 2. 使用Overlapcircle2.1 介绍2.2 场景窗口可视化2.3 完整实例代码2.4 存在问题 3. 使用OverlapBox3.1 介绍3.2 场景窗口可视化3.3 完整实例代码3.4 注意事…...
一、kafka入门
Kafka入门 为什么要用消息中间件? 异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。 串行方式:将注册信息写入数据库成功后,发送注册邮件ÿ…...
公司新来一00后,真让人崩溃...
2022年已经结束结束了,最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备今年的金九银十的面试计划。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的…...
(1Gb)S28HS01GTGZBHA030/ S28HS01GTGZBHV033/ S28HS01GTGZBHA033 FLASH - NOR闪存器件
产品简介: Infineon 带有HyperBus™的S26HSxT以及S26HLxT Semper™闪存是一种高性能、安全可靠的NOR闪存解决方案。 这些组件集成了关键的安全功能,用于汽车、工业、通信等行业的各种应用。S26HSxT和S26HLxT Semper闪存采用HyperBus接口,符…...
苹果服务端通知v2处理(AppStore Server Notifications V2)
苹果服务端通知v2处理 关键词: App Store Server Notifications V2、Python源码、苹果订阅、JWS、x5c、JSON WEB TOKEN 背景 最近要接入苹果订阅功能,调研后发现订阅生命周期内的状态变更是通过苹果服务端通知返回的(什么时候普通内购也能加上减少掉单的概率)&am…...
matlab 道路点云路缘石边界提取
目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接一、功能概述 1、算法概述 1、对于扫描线上的每个点,该函数计算这三个特征。 高差特征——计算一个点周围的标准偏差和高度最大差。路缘石点的标准偏差和高度差必须分别在指定的Heig…...
二叉树详解:带你掌握二叉树
目录 前言1. 树型结构1. 1 树的概念1.2 树的特点1.3 树的相关术语 2. 二叉树(binary tree)2.1 二叉树的概念2.2 二叉树中的特殊树2.2.1 满二叉树2.2.2 完全二叉树 2.3 二叉树的性质 3. 二叉树的遍历3.1 前序遍历3.2 中序遍历3.3 后序遍历3.4 层序遍历 总…...
LNMP网站框架搭建(编译安装)
目录 一、Nginx的工作原理 工作进程: 二、Nginx编译安装安装 三、mysql的编译安装 四、php的编译安装 验证PHP与nginx的是否连接 验证lnmp的是否搭建成功 五、部署 Discuz!社区论坛 一、Nginx的工作原理 php-fpm.conf 是控制php-fpm守护…...
详解Servlet API
目录 前言 HttpServlet HttpServletRequest 代码实例 打印请求信息 通过URL中的queryString进行传递。 通过post请求的body,使用form表单传递 通过POST 请求中的 body 按照 JSON 的格式进行传递 HttpServletResponse 核心方法代码实例 设置状态码 自动刷…...
【小白教程】Docker安装使用教程,以及常用命令!
【小白教程】Docker安装使用教程,以及常用命令! - 带你薅羊毛最近调试Docker内容,顺手记录一下,我常用的几个命令!这里总结一下,方便自己也同时方便大家使用! 内容慢慢完善更新!如有…...
TypeScript基础
TS编译运行 ts不是在终端运行,是一门中间语言,最终编译为js运行。 手动编译 // 1. ts编译为js npm i -g typescript // 查看版本 tsc -v// 2. ts直接运行,主要用来查看是否报错 npm i -g ts-node // 查看版本 ts-node -v1.手动编译ts代码 …...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
