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) 权限不足 chmodsudo 运行
ENOMEM (Out of memory) 内存不足 增加 swap,关闭无关进程
ECONNREFUSED 连接被拒绝 检查服务器是否运行

四、Linux系统调用跟踪工具strace的更多相关文章

  1. 自助Linux之问题诊断工具strace

    转  http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...

  2. 自助Linux之问题诊断工具strace【转】

    转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...

  3. Linux之问题诊断工具strace

    转载于:https://www.cnblogs.com/lidabo/p/4523755.html 引言 “Oops,系统挂死了..." “Oops,程序崩溃了..." “Oops ...

  4. 问题排查利器:Linux 原生跟踪工具 Ftrace 必知必会

    本文地址:https://www.ebpf.top/post/ftrace_tools TLDR,建议收藏,需要时查阅. 如果你只是需要快速使用工具来进行问题排查,包括但不限于函数调用栈跟踪.函数调用 ...

  5. 【Linux】 诊断工具-strace

    1,别人家的总结: http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 2,我自己碰到问题: 暂无. 3,使用场景: 程序 ...

  6. 服务跟踪sleuth和可视化跟踪工具Zipkin

    一.增加配置 在Order工程中添加配置 <dependency> <groupId>org.springframework.cloud</groupId> < ...

  7. Linux下四款常见远程工具比较

    摘要:Linux远程可不像Windows下那么方便,主要是连接的速度.显示的画质不能令人满意(延迟.撕裂).本文只是说一下我用过的四款远程工具.Anydesk官网:https://anydesk.co ...

  8. Linux 性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  9. [转]Linux性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  10. 超全整理!Linux性能分析工具汇总合集

    转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...

随机推荐

  1. 【Java】字符串常用操作

    字符的常用技巧 char c; 字母的顺序:c - 'A'.c - 'a' 字母大小写转换:c - 'a' + 'A'.c - 'A' + 'a' 数字字符转换为数字:c - '0' String.S ...

  2. Hyperledger Fabric - 区块链应用

    Fabric Gateway SDK 实现Fabric的编程模型,提供了一系列简单的API给应用程序与Fabric区块链网络进行交互 应用程序将各自的网络交互委托给其网关,每个网关都了解网络信道拓扑, ...

  3. Python 潮流周刊#96:MCP 到底是什么?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. 服务端获取实际IP工具类

    import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHo ...

  5. strftime()函数的用法

    strftime()函数的用法 strftime()函数可以把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其它形式的字符串.strftime()的语法是strftime(格式, 日期/ ...

  6. hadoop部署安装(四)KAFKA+SCALA

    3.8 配置scala 下载,解压 wget https://downloads.lightbend.com/scala/2.13.0-M5/scala-2.13.0-M5.tgz tar -zxvf ...

  7. C#基础——不可变集合

    参照:https://mp.weixin.qq.com/s/NFBc2bNeHpdadh89T44Lpg 在 .NET Core 中就存在着这三大 IReadOnlyList,IReadOnlyDic ...

  8. 在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接

    在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接 引言 在容器化环境中,确保不同服务之间的可靠通信是至关重要的.本文将指导你如何使用Podman来配置Dify ...

  9. 基于SaaS纯BS架构的全院级PACS系统

           2014年曾经做过一版简单的Dicom Web Viewer,之前的Web版本由于技术和功能的极限性,仅能简单的运用于临床阅片和患者的电子胶片使用,无法普及到放射和超声等影像科室.影像科 ...

  10. idea 调试的时候变量的值变成了jar包显示

    如图所示,暂时不知道怎么处理. 应该是module的问题.我是上了重建module了,代码不是很多.