四、Linux系统调用跟踪工具strace
4.1、strace(系统调用跟踪)
strace 是 Linux 下的系统调用跟踪工具,可以监视进程执行时与内核的交互,包括文件操作、进程管理、网络通信、内存分配等。它主要用于调试、性能优化、问题排查。
1. 基本用法
1.1、直接运行程序
strace ./my_program
作用:
- 追踪
my_program进程的所有系统调用,并在终端输出详细的执行过程。
示例:
strace ls
部分输出:
execve("/bin/ls", ["ls"], 0x7ffd12d4) = 0
brk(NULL) = 0x55c3
openat(AT_FDCWD, ".", O_RDONLY|O_DIRECTORY) = 3
read(3, "file1\nfile2\n", 1024) = 12
close(3) = 0
write(1, "file1 file2\n", 14) = 14
exit_group(0) = ?
解释:
execve():执行ls程序。openat():打开当前目录 (.) 以读取文件列表。read():读取目录内容。write():输出file1 file2到终端。
1.2、将输出保存到文件
strace -o trace_log.txt ./my_program
作用:
-o trace_log.txt:将strace结果保存到trace_log.txt,不会在终端显示。
示例:
strace -o output.log ls
output.log文件内包含ls的所有系统调用。
1.3、跟踪子进程
strace -f ./my_program
作用:
-f:跟踪my_program及其所有子进程的系统调用。
示例:
strace -f bash -c "ls"
bash -c "ls"会创建子进程ls,-f确保ls也被跟踪。
1.4、显示时间戳
strace -t ./my_program
作用:
-t:在每行前面加上时间戳,显示每个系统调用的执行时间。
示例:
strace -t ls
输出:
12:30:01 execve("/bin/ls", ["ls"], 0x7ffd12d4) = 0
12:30:01 openat(AT_FDCWD, ".", O_RDONLY|O_DIRECTORY) = 3
12:30:01 read(3, "file1\nfile2\n", 1024) = 12
12:30:01 write(1, "file1 file2\n", 14) = 14
1.5、只跟踪特定类型的系统调用
1.5.1、仅跟踪文件操作
strace -e open,read,write,close ./my_program
作用:
-e open,read,write,close:只显示open()、read()、write()和close()相关的系统调用。
示例:
strace -e open,read,write,close ls
输出:
openat(AT_FDCWD, ".", O_RDONLY|O_DIRECTORY) = 3
read(3, "file1\nfile2\n", 1024) = 12
write(1, "file1 file2\n", 14) = 14
close(3) = 0
1.5.2、仅跟踪网络相关调用
strace -e trace=network ./my_program
trace=network:仅跟踪socket()、connect()、send()、recv()等网络调用。
1.6、统计系统调用次数
strace -c ./my_program
作用:
-c选项只显示系统调用的统计信息,而不是详细日志。
示例:
strace -c ls
输出:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
85.71 0.002156 1234 10 openat
14.29 0.000358 179 2 write
0.00 0.000000 0 1 close
------ ----------- ----------- --------- --------- ----------------
100.00 0.002514 13 total
解释:
openat调用了 10 次,占 85.71% 的执行时间。write只调用了 2 次,但占 14.29% 的执行时间。close只调用了 1 次,占比几乎为 0。
1.7、追踪某个已经运行的进程
strace -p 1234
作用:
-p 1234:跟踪 PID 为1234的进程。
示例:
strace -p $(pgrep nginx)
- 监控
nginx进程的所有系统调用。
2、关键系统调用解析
2.1、execve()
execve("./panorama", ["./panorama"], 0x7ffc12c4) = 0
execve()是进程执行的核心系统调用,表示panorama被执行。
2.2、open() / openat()
open("/usr/lib/libgstvideo-1.0.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
进程尝试打开
libgstvideo-1.0.so.0,但文件不存在(ENOENT)。可能的解决方案:
apt install libgstreamer1.0-dev
2.3、read() / write()
read(3, "file1\nfile2\n", 1024) = 12
write(1, "file1 file2\n", 14) = 14
read():读取数据到缓冲区。write():将数据输出到终端 (fd=1代表stdout)。
2.4、mmap()
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Out of memory)
ENOMEM表示内存不足,可能导致程序崩溃。
2.5、socket() / connect()
socket(AF_INET, SOCK_STREAM, 0) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=...}, 16) = -1 ECONNREFUSED (Connection refused)
ECONNREFUSED:连接被拒绝,可能是网络问题或服务器未运行。
3、 解决常见问题
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
ENOENT (No such file) |
文件不存在 | 检查路径,安装缺失的依赖 |
EACCES (Permission denied) |
权限不足 | chmod 或 sudo 运行 |
ENOMEM (Out of memory) |
内存不足 | 增加 swap,关闭无关进程 |
ECONNREFUSED |
连接被拒绝 | 检查服务器是否运行 |
四、Linux系统调用跟踪工具strace的更多相关文章
- 自助Linux之问题诊断工具strace
转 http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...
- 自助Linux之问题诊断工具strace【转】
转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...
- Linux之问题诊断工具strace
转载于:https://www.cnblogs.com/lidabo/p/4523755.html 引言 “Oops,系统挂死了..." “Oops,程序崩溃了..." “Oops ...
- 问题排查利器:Linux 原生跟踪工具 Ftrace 必知必会
本文地址:https://www.ebpf.top/post/ftrace_tools TLDR,建议收藏,需要时查阅. 如果你只是需要快速使用工具来进行问题排查,包括但不限于函数调用栈跟踪.函数调用 ...
- 【Linux】 诊断工具-strace
1,别人家的总结: http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 2,我自己碰到问题: 暂无. 3,使用场景: 程序 ...
- 服务跟踪sleuth和可视化跟踪工具Zipkin
一.增加配置 在Order工程中添加配置 <dependency> <groupId>org.springframework.cloud</groupId> < ...
- Linux下四款常见远程工具比较
摘要:Linux远程可不像Windows下那么方便,主要是连接的速度.显示的画质不能令人满意(延迟.撕裂).本文只是说一下我用过的四款远程工具.Anydesk官网:https://anydesk.co ...
- Linux 性能分析工具汇总合集
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...
- [转]Linux性能分析工具汇总合集
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...
- 超全整理!Linux性能分析工具汇总合集
转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
随机推荐
- Redis 相关
高并发多机的时候,虽然有失效时间,但还是会有短时间内缓存和数据库数据不一致(读操作不需要特殊操作),更新操作的时候先删除缓存,再更新数据库先更新数据库,再删除缓存原子性破坏,增加队列重试 先删除缓存, ...
- C# Office COM 加载项
Office COM 加载项开发笔记 一.实现接口 IDTExtensibility2 这是实现 Office COM 加载项最基本的接口 添加 COM 引用 Microsoft Add-In Des ...
- Linux浅谈(四)----中断&异常
简介 CPU中断时操作系统中的两个重要概念,都作用于改变CPU执行的正常流程. 当出现某些特殊情况(如外部设备请求服务.定时器时间到等)时,CPU 暂停当前正在执行的程序,转去执行处理这些特殊情况的程 ...
- 适用于LixtBox的,开启UI虚拟化时,某些时候需要定位到还没加载的项,比如自动选中某项,视图自动移过去等等
1 /// <summary> 2 /// 将指定父级的下级索引元素,显示在视野下,使其可见 3 /// </summary> 4 /// <param name=&qu ...
- sonarqube+gitlab+jenkins+maven集成搭建(一)
一SonarQube介绍SonarQube 是一个开源的代码分析平台,用来持续分析和评测代码的质量,支持检测 Java . JavaScript .C#.C.C++ 等二十几种编程语言.通过 Sona ...
- C# 14 新增功能一览,你觉得实用吗?
前言 今天咱们一起来看看在 C# 14 中新增的几个功能特性,是否给我们日常编码带了来便利. 前提准备 要体验 C# 14 中的新增功能,你需要安装最新的 Visual Studio 2022 版本或 ...
- uni-app小程序登录后…
前情 最近新接了一个全新项目,是类似商城的小程序项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,其中就有一个用户登录功能,小程序部分页面是需要登录才可以查看的,对于未登录的用户需 ...
- 操作系统:Linux如何获取所有设备信息
本节了解下Linux是如何管理设备的,将从Linux如何组织设备开始,然后研究设备相关的数据结构,最后写一个Linux设备驱动实例. 感受一下Linux下的设备信息 Linux的设计哲学是一起皆是文件 ...
- iOS快捷指令——记录今天、今年已过进度的工具
起因是看到了 大佬博客 里面一个计时的小工具,于是也想搞一个来提醒自己珍惜时间. 经过一段时间对快捷指令的摸索,最终选择了如下的方式完成: 快捷指令的链接在这里给出: https://www.iclo ...
- Windows下使用Qt复制文件夹(xcopy,非QFile)
Windows下使用Qt复制文件夹(xcopy,非QFile) .h文件 #ifndef CXCOPY_H #define CXCOPY_H #include <QWidget> #inc ...