四、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操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
随机推荐
- XWorker - 人机协同的共生系统
这是XWorker的定位,让AI写的,因为动态模型和XWorker对AI本身也有特殊意义,所以让AI写也是可以的.部分是AI的幻觉,如(四.重塑产业实践),XWorker还没实现这些.之所以保留不动, ...
- Vim 操作-替换
Vim 操作-替换 substitute :[range]s[ubstitute]/{pattern}/{string}/{flag} 替换的操作范围以行为基础: %-全局范围,m,n-使用逗号隔开的 ...
- CSS那些事读书笔记-2
背景 作为一个后端开发,曾经尝试过学习前端,但是总觉不得要领,照猫画虎,而公司里又有专业的前端开发,工作中几乎接触不到实际的前端任务,所以前端的技能田野一直是一片荒芜.但是笔者深知前端的技能对找工作和 ...
- MySQL 的 JSON 查询
MySQL 的 JSON 路径格式 MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据 基本结构 MySQL 中的 JSON 路径遵循以下通用格式 $[路径组件] 路 ...
- ASP.NET 简单实现数字时钟
每隔1000毫秒(1s)获取一次当前时间 <asp:ScriptManager ID="ScriptManager_Time" runat="server" ...
- 一个Bug让人类科技倒退几十年?
大家好,我是良许. 前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的. 所以,今天就跟大家科普一下这个人类历史上最大的 Bug . 1. 全世 ...
- Linux内核模块开发(简单)
Linux系统为应用程序提供了功能强大且容易扩展的API,但在某些情况下,这还远远不够.与硬件交互或进行需要访问系统中特权信息的操作时,就需要一个内核模块. Linux内核模块是一段编译后的二进制代码 ...
- liunx git 免密码登录
vscode远程git或在linux环境使用git时,每次clone都要输入帐号密码,很不方便,可以使用下面一行命令,系统会记录你输入的下一次帐号密码.(明文记录,注意规避风险) # 执行 g ...
- SaltStack 远程命令执行中文乱码问题
问题 我在一台服务器上写了一个简单的 Python 脚本 haha.py,内容如下: [root@localhost ~]# cat haha.py print("你好") 当我在 ...
- C#自动属性提供默认值的方法
编程之路转自:cjavapy.com/article/55/ _ .NET(C#)中,自动属性(Auto-Implemented Properties)提供了一种简洁的方式来实现属性而无需显式定义字 ...