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. XWorker - 人机协同的共生系统

    这是XWorker的定位,让AI写的,因为动态模型和XWorker对AI本身也有特殊意义,所以让AI写也是可以的.部分是AI的幻觉,如(四.重塑产业实践),XWorker还没实现这些.之所以保留不动, ...

  2. Vim 操作-替换

    Vim 操作-替换 substitute :[range]s[ubstitute]/{pattern}/{string}/{flag} 替换的操作范围以行为基础: %-全局范围,m,n-使用逗号隔开的 ...

  3. CSS那些事读书笔记-2

    背景 作为一个后端开发,曾经尝试过学习前端,但是总觉不得要领,照猫画虎,而公司里又有专业的前端开发,工作中几乎接触不到实际的前端任务,所以前端的技能田野一直是一片荒芜.但是笔者深知前端的技能对找工作和 ...

  4. MySQL 的 JSON 查询

    MySQL 的 JSON 路径格式 MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据 基本结构 MySQL 中的 JSON 路径遵循以下通用格式 $[路径组件] 路 ...

  5. ASP.NET 简单实现数字时钟

    每隔1000毫秒(1s)获取一次当前时间 <asp:ScriptManager ID="ScriptManager_Time" runat="server" ...

  6. 一个Bug让人类科技倒退几十年?

    大家好,我是良许. 前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的. 所以,今天就跟大家科普一下这个人类历史上最大的 Bug . 1. 全世 ...

  7. Linux内核模块开发(简单)

    Linux系统为应用程序提供了功能强大且容易扩展的API,但在某些情况下,这还远远不够.与硬件交互或进行需要访问系统中特权信息的操作时,就需要一个内核模块. Linux内核模块是一段编译后的二进制代码 ...

  8. liunx git 免密码登录

    vscode远程git或在linux环境使用git时,每次clone都要输入帐号密码,很不方便,可以使用下面一行命令,系统会记录你输入的下一次帐号密码.(明文记录,注意规避风险)   # 执行   g ...

  9. SaltStack 远程命令执行中文乱码问题

    问题 我在一台服务器上写了一个简单的 Python 脚本 haha.py,内容如下: [root@localhost ~]# cat haha.py print("你好") 当我在 ...

  10. C#自动属性提供默认值的方法

    编程之路转自:cjavapy.com/article/55/ _  .NET(C#)中,自动属性(Auto-Implemented Properties)提供了一种简洁的方式来实现属性而无需显式定义字 ...