四、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操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
随机推荐
- 【Java】字符串常用操作
字符的常用技巧 char c; 字母的顺序:c - 'A'.c - 'a' 字母大小写转换:c - 'a' + 'A'.c - 'A' + 'a' 数字字符转换为数字:c - '0' String.S ...
- Hyperledger Fabric - 区块链应用
Fabric Gateway SDK 实现Fabric的编程模型,提供了一系列简单的API给应用程序与Fabric区块链网络进行交互 应用程序将各自的网络交互委托给其网关,每个网关都了解网络信道拓扑, ...
- Python 潮流周刊#96:MCP 到底是什么?(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 服务端获取实际IP工具类
import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHo ...
- strftime()函数的用法
strftime()函数的用法 strftime()函数可以把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其它形式的字符串.strftime()的语法是strftime(格式, 日期/ ...
- hadoop部署安装(四)KAFKA+SCALA
3.8 配置scala 下载,解压 wget https://downloads.lightbend.com/scala/2.13.0-M5/scala-2.13.0-M5.tgz tar -zxvf ...
- C#基础——不可变集合
参照:https://mp.weixin.qq.com/s/NFBc2bNeHpdadh89T44Lpg 在 .NET Core 中就存在着这三大 IReadOnlyList,IReadOnlyDic ...
- 在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接
在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接 引言 在容器化环境中,确保不同服务之间的可靠通信是至关重要的.本文将指导你如何使用Podman来配置Dify ...
- 基于SaaS纯BS架构的全院级PACS系统
2014年曾经做过一版简单的Dicom Web Viewer,之前的Web版本由于技术和功能的极限性,仅能简单的运用于临床阅片和患者的电子胶片使用,无法普及到放射和超声等影像科室.影像科 ...
- idea 调试的时候变量的值变成了jar包显示
如图所示,暂时不知道怎么处理. 应该是module的问题.我是上了重建module了,代码不是很多.