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. Redis 相关

    高并发多机的时候,虽然有失效时间,但还是会有短时间内缓存和数据库数据不一致(读操作不需要特殊操作),更新操作的时候先删除缓存,再更新数据库先更新数据库,再删除缓存原子性破坏,增加队列重试 先删除缓存, ...

  2. C# Office COM 加载项

    Office COM 加载项开发笔记 一.实现接口 IDTExtensibility2 这是实现 Office COM 加载项最基本的接口 添加 COM 引用 Microsoft Add-In Des ...

  3. Linux浅谈(四)----中断&异常

    简介 CPU中断时操作系统中的两个重要概念,都作用于改变CPU执行的正常流程. 当出现某些特殊情况(如外部设备请求服务.定时器时间到等)时,CPU 暂停当前正在执行的程序,转去执行处理这些特殊情况的程 ...

  4. 适用于LixtBox的,开启UI虚拟化时,某些时候需要定位到还没加载的项,比如自动选中某项,视图自动移过去等等

    1 /// <summary> 2 /// 将指定父级的下级索引元素,显示在视野下,使其可见 3 /// </summary> 4 /// <param name=&qu ...

  5. sonarqube+gitlab+jenkins+maven集成搭建(一)

    一SonarQube介绍SonarQube 是一个开源的代码分析平台,用来持续分析和评测代码的质量,支持检测 Java . JavaScript .C#.C.C++ 等二十几种编程语言.通过 Sona ...

  6. C# 14 新增功能一览,你觉得实用吗?

    前言 今天咱们一起来看看在 C# 14 中新增的几个功能特性,是否给我们日常编码带了来便利. 前提准备 要体验 C# 14 中的新增功能,你需要安装最新的 Visual Studio 2022 版本或 ...

  7. uni-app小程序登录后…

    前情 最近新接了一个全新项目,是类似商城的小程序项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,其中就有一个用户登录功能,小程序部分页面是需要登录才可以查看的,对于未登录的用户需 ...

  8. 操作系统:Linux如何获取所有设备信息

    本节了解下Linux是如何管理设备的,将从Linux如何组织设备开始,然后研究设备相关的数据结构,最后写一个Linux设备驱动实例. 感受一下Linux下的设备信息 Linux的设计哲学是一起皆是文件 ...

  9. iOS快捷指令——记录今天、今年已过进度的工具

    起因是看到了 大佬博客 里面一个计时的小工具,于是也想搞一个来提醒自己珍惜时间. 经过一段时间对快捷指令的摸索,最终选择了如下的方式完成: 快捷指令的链接在这里给出: https://www.iclo ...

  10. Windows下使用Qt复制文件夹(xcopy,非QFile)

    Windows下使用Qt复制文件夹(xcopy,非QFile) .h文件 #ifndef CXCOPY_H #define CXCOPY_H #include <QWidget> #inc ...