linux strace调式定位系统问题

strace 的基本功能

strace 的主要功能包括:

  • 跟踪系统调用:显示进程执行时调用的系统函数及其参数和返回值。
  • 监控信号:记录进程接收到的信号。
  • 性能分析:统计系统调用的执行时间和次数。
  • 调试支持:帮助定位程序崩溃、性能瓶颈或其他异常行为。
  •  strace 的常用参数
  • 以下是 strace 常用参数及其功能:

  • -p <PID>:跟踪指定进程 ID 的系统调用。
  • -c:统计系统调用的执行时间、次数和错误次数。
  • -e <事件>:指定要跟踪的事件类型,例如 -e trace=open,read,write
  • -f:跟踪由 fork() 创建的子进程。
  • -t:在输出中显示时间戳(秒)。
  • -tt:显示更精确的时间戳(包括微秒)。
  • -T:显示每个系统调用花费的时间。
  • -d:输出 strace 本身的调试信息。

1,查看某个函数的调用情况:

strace -e  trace=function, function2 -p $pid

root@ubuntu:/home/lark# strace -e trace=epoll_wait -p 1051
strace: Process 1051 attached
epoll_wait(3, 

[], 1, 10000)             = 0
epoll_wait(3, 
[], 1, 10000)             = 0
epoll_wait(3, 

2,系统调用 strace ls

lark@ubuntu:~$ strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffe76d6d020 /* 48 vars */) = 0
brk(NULL)                               = 0x55dca912f000
arch_prctl(0x3001 /* ARCH_??? */, 0x7fffb5cf4f70) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=89543, ...}) = 0
mmap(NULL, 89543, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7aac2b7000
close(3)                                = 0
mprotect(0x7f7aac290000, 135168, PROT_NONE) = 0
pread64(3,"\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\\\373\211m\324\17\220\252\214l\213\270V\0M\37"..., 68, 824) = 68
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7aabfdc000
arch_prctl(ARCH_SET_FS, 0x7f7aabfdd400) = 0
mprotect(0x7f7aac280000, 16384, PROT_READ) = 0
munmap(0x7f7aac2b7000, 89543)           = 0
set_tid_address(0x7f7aabfdd6d0)         = 2021
set_robust_list(0x7f7aabfdd6e0, 24)     = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7f7aabfe4c90, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f7aabff2420}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7fffb5cf4ec0) = -1 ENOENT (No such file or directory)
brk(NULL)                               = 0x55dca912f000
brk(0x55dca9150000)                     = 0x55dca9150000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 387
read(3, "", 1024)                       = 0
ioctl(1, TIOCGWINSZ, {ws_row=45, ws_col=203, ws_xpixel=0, ws_ypixel=0}) = 0
getdents64(3, /* 24 entries */, 32768)  = 768
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "1.txt  Desktop\tDocuments  Downlo"..., 871.txt  Desktop    Documents  Downloads  Music  Pictures  Public  share  Templates  Videos
) = 87
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

3,监控信号:strace -p pid  -e trace=signal -e trace=sigsegv

示例 1:监控进程接收到的所有信号

假设进程 ID 为 1234,可以使用以下命令:

strace -p 1234 -e trace=signal -e trace=sigsegv

lark@ubuntu:~$ kill -9 3242 

lark@ubuntu:~$ strace -p 3242 -e trace=signal
strace: Process 3242 attached
+++ killed by SIGKILL +++ 

参数trace=sigsegv可选择。

4,查看耗时 strace -T ls

ark@ubuntu:~$ strace -T ls
execve("/usr/bin/ls", ["ls"], 0x7ffe710124f8 /* 49 vars */) = 0 <0.000544>
brk(NULL)                               = 0x56352a5b2000 <0.000145>
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe72b0ca50) = -1 EINVAL (Invalid argument) <0.000143>
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000188>
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000167>
fstat(3, {st_mode=S_IFREG|0644, st_size=89543, ...}) = 0 <0.000144>
mmap(NULL, 89543, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9c94839000 <0.000328>
close(3)                                = 0 <0.000112>
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 <0.000093>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@p\0\0\0\0\0\0"..., 832) = 832 <0.000059>
fstat(3, {st_mode=S_IFREG|0644, st_size=163200, ...}) = 0 <0.000096>
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9c94837000 <0.000060>
mmap(NULL, 174600, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9c9480c000 <0.000061>

查看ls系统的耗时 strace -tt ls,使用 -tt 显示微秒级时间戳

lark@ubuntu:~$ strace -tt ls
07:03:25.416052 execve("/usr/bin/ls", ["ls"], 0x7ffc6f804288 /* 49 vars */) = 0
07:03:25.416881 brk(NULL)               = 0x56445be62000
07:03:25.417351 arch_prctl(0x3001 /* ARCH_??? */, 0x7ffccbd1e540) = -1 EINVAL (Invalid argument)
07:03:25.418487 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
07:03:25.418825 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
07:03:25.419105 fstat(3, {st_mode=S_IFREG|0644, st_size=89543, ...}) = 0
07:03:25.419404 mmap(NULL, 89543, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1ede6b8000
07:03:25.419930 close(3)                = 0
07:03:25.420121 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
07:03:25.420316 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@p\0\0\0\0\0\0"..., 832) = 832
07:03:25.420479 fstat(3, {st_mode=S_IFREG|0644, st_size=163200, ...}) = 0

5,系统调用次数统计

strace -c 参数能够对程序执行过程中的系统调用进行统计分析,输出以下信息:

  • 调用次数:每个系统调用被调用的总次数。
  • 错误次数:每个系统调用失败的次数。
  • 总耗时:每个系统调用所消耗的总时间。

strace -c ./my_program
查看my_program(while(1)循环函数)的调用次数

lark@ubuntu:~$ strace -c  ./a.out 
^Cstrace: Process 3382 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         1           read
  0.00    0.000000           0         2           close
  0.00    0.000000           0         2           fstat
  0.00    0.000000           0         7           mmap
  0.00    0.000000           0         3           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         1           brk
  0.00    0.000000           0         6           pread64
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2         1 arch_prctl
  0.00    0.000000           0         2           openat
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    29         2 total

6,strace 的 -d 参数用于输出调试信息,帮助用户更清晰地理解系统调用的细节。这些信息包括:

  • 系统调用的名称和参数。
  • 调用的返回值。
  • 错误信息(如果有)。
  • 时间戳(如果与 -tt 参数结合使用)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别手抖困扰:全方位健康护理指南

手抖&#xff0c;医学上称为震颤&#xff0c;是常见的身体症状&#xff0c;可能由多种原因引发&#xff0c;了解其成因并采取科学护理措施&#xff0c;对改善症状、维护健康至关重要。 生理性手抖往往因情绪激动、过度劳累、大量饮用咖啡或酒精等引起&#xff0c;这种手抖通常较…

华为2025年校招笔试真题手撕教程(一)

一、题目 输入&#xff1a; 第一行为记录的版本迭代关系个数N&#xff0c;范围是[1&#xff0c;100000]; 第二行到第N1行&#xff1a;每行包含两个字符串&#xff0c;第一个字符串为当前版本&#xff0c;第二个字符串为前序版本&#xff0c;用空格隔开。字符串包含字符个数为…

Qt 的多线程

Qt 中的多线程主要用于处理耗时操作&#xff0c;避免阻塞主线程&#xff08;UI 线程&#xff09;&#xff0c;从而提高程序的响应性和运行效率。以下是 Qt 多线程的相关技术总结&#xff1a; 常见的多线程实现方式 继承 QThread 类 &#xff1a;最基础的实现方式&#xff0c;具…

基于ITcpServer/IHttpServer框架的HTTP服务器

https://www.cnblogs.com/MuZhangyong/p/16839231.html 在基于ITcpServer/IHttpServer框架的HTTP服务器实现中,OnBody方法主要用于接收HTTP请求体数据,而触发HTTP响应通常是在OnMessageComplete方法中完成。以下是完整的响应触发机制说明: sequenceDiagramClient->>…

Windows 下 Qt 项目配置 FFmpeg 简明指南

一、作用 在qt项目中配置ffmpeg库 二、步骤 1、直接使用已经编译好的ffmpeg库文件&#xff0c;分为win32版本和win64版本&#xff1b; 2、win32版本下载地址&#xff1a;https://github.com/sudo-nautilus/FFmpeg-Builds-Win32/releases/tag/latest 3、win64版本下载地址&a…

Attu下载 Mac版与Win版

通过Git地址下载 Mac 版选择对于的架构进行安装 其中遇到了安装不成功&#xff0c;文件损坏等问题 一般是两种情况导致 1.安装版本不对 2.系统权限限制 https://www.cnblogs.com/similar/p/11280162.html打开terminal执行以下命令 sudo spctl --master-disable安装包Git下载地…

SpringBoot3集成Oauth2.1——5资源地址配置

配置问题说明 如下所示&#xff0c;代码配置了两个&#xff0c;过滤器&#xff0c;一个是资源保护&#xff0c;一个是不保护。 /** Description: 配置需要保护的资源* author: 胡涛* mail: hutao_2017aliyun.com* date: 2025年5月23日 下午2:28:20*/BeanOrder(2)public Securi…

Python urllib.parse 模块中的 urljoin 方法

Python urllib.parse 模块中的 urljoin 方法 urljoin 是 Python 标准库中 urllib.parse 模块的一个方法&#xff0c;用于将基础 URL 和相对路径拼接成完整的 URL。它会根据传入的基础 URL 自动处理协议、域名以及路径的部分匹配逻辑。 以下是关于该方法的具体说明和示例&…

AI大模型和SpringAI简介

一、Spring AI 简介 SpringAI整合了全球&#xff08;主要是国外&#xff09;的大多数大模型&#xff0c;而且对于大模型开发的三种技术架构都有比较好的封装和支持&#xff0c;开发起来非常方便。 不同的模型能够接收的输入类型、输出类型不一定相同。SpringAI根据模型的输入…

在TIA 博途中下载程序时找不到对应的网卡怎么办?

1. 检查物理连接 确认网线已正确连接PLC和PC&#xff0c;接口指示灯正常。 尝试更换网线或交换机端口&#xff0c;排除硬件故障。 2. 确认网卡驱动已安装 设备管理器检查&#xff1a; 右键点击“此电脑” → “管理” → “设备管理器”。 展开“网络适配器”&#xff0c;确…

Zabbix实践!客户端自动发现

在线答疑&#xff1a;乐维社区 一、客户端状态检查 1.检查客户端的zabbix-agent2是否正常 [rootnode1 ~]# systemctl is-active zabbix-agent2.service active 2.从服务端检查是否可以获得客户端信息 [rootIT-01 ~]# zabbix_get -s ‘192.168.200.135’ -p 10050 -k ‘agent.p…

动态规划中的 求“最长”、“最大收益”、“最多区间”、“最优策略” 双重 for + 状态转移

以最长递增子序列为例 &#x1f3af; 首先明确目标 以最长上升子序列&#xff08;LIS&#xff09;为例&#xff0c;假设输入是&#xff1a; nums : []int{10, 9, 2, 5, 3, 7, 101, 18}我们定义&#xff1a; dp[i]&#xff1a;以 nums[i] 为结尾的最长上升子序列长度目标&…

SEO关键词与长尾词高效布局

内容概要 在SEO优化实践中&#xff0c;关键词布局的科学性与系统性直接影响流量的获取效率与可持续性。本文以核心关键词筛选为起点&#xff0c;结合长尾词挖掘工具与语义关联分析技术&#xff0c;逐步构建覆盖用户全搜索场景的内容矩阵。通过金字塔结构模型&#xff0c;实现高…

考研数一公式笔记

考研数学&#xff08;一&#xff09;核心结论与易错点详细笔记 第一部分&#xff1a;高等数学 一、函数、极限、连续 (一) 重要结论与公式 等价无穷小替换 (仅限乘除运算&#xff0c;极限过程为 x → 0 或某特定值导致因子→0)&#xff1a; sin x ~ x tan x ~ x arcsin x …

Debezium TableSchemaBuilder详解

Debezium TableSchemaBuilder详解 1. 类的作用与功能 1.1 核心作用 TableSchemaBuilder是Debezium中负责构建表Schema的核心类,主要功能包括: Schema构建:将数据库表结构转换为Kafka Connect的Schema定义主键处理:生成表的主键Schema值Schema处理:生成表的非主键字段Sc…

49 python Matplotlib之Pandas 数据可视化

Pandas 是 Python 中用于数据处理的核心库,其内置了基于 Matplotlib 的可视化功能,可通过 DataFrame.plot() 和 Series.plot() 方法快速生成常见图表,无需手动编写绘图代码,大幅提升效率。 一、Pandas 核心绘图方法 基础语法如下:该代码为伪代码,仅做语法说明,无法执行…

《微服务架构设计模式》笔记

思维导图 1-3章 4-6 章 5-13 章 资料 配套代码仓库&#xff1a;https://github.com/microservices-patterns/ftgo-application 作者网站&#xff1a;https://microservices.io/

手写一个简单的线程池

手写一个简单的线程池 项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tearing-thread-pool 基于一个b站up的课程&#xff1a;https://www.bilibili.com/video/BV1cJf2YXEw3/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 理…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(完结)

手机打电话时由对方DTMF响应切换多级IVR语音菜单&#xff08;完结&#xff09; --本地AI电话机器人 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音菜单&#xff08;话术脚本与实战&#xff09; 下一篇&#xff1a;编写中 一、前言 经过前面几个篇章的详细阐…

Android.mk解析

一、变量说明: 1.LOCAL_PATH:= $(call my-dir) 此行代码在Android.mk的开头,用于给出当前文件的路径 LOCAL_PATH 用于在开发树中查找源文件 宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录) 2.LOCAL_PACKAGE_NAME := SecSettings …