当前位置:首页>Linux>Linux系统性能调试必杀技: strace调试工具用法

Linux系统性能调试必杀技: strace调试工具用法

  • 2026-10-11 08:05:24
Linux系统性能调试必杀技: strace调试工具用法
Hello,大家好,我是程序媛MM。

本文约1800字,继续沿着《Linux调试工具系统化学习计划》的学习路径来学习Linux调试工具。早些年曾经用strace这个命令来排查并解决了一个困扰我的阻塞问题(需要拷机很久才出现),详情查看《项目实战案例: 进程recv阻塞问题分析与解决》。

strace 是 Linux 下核心的进程调试工具,核心作用是跟踪进程的系统调用和信号,快速定位进程异常(如阻塞、崩溃、资源无法获取等),常与 vmstat、top 协同使用,排查进程层面的深层问题。本文梳理了strace的核心用法,简洁易懂,适配日常开发工作中快速排查需求。

我建了一个BSP学习交流群,想学BSP或者已经是BSP开发者可私信我,加入群,一起交流学习,共同进步。

关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。


一 strace 核心作用 


[1].  跟踪进程发起的所有系统调用(如文件读写、网络连接、内存申请等);

[2].  查看进程接收的信号(如中断、终止信号);

[3].  定位进程异常原因:如进程卡死、无法启动、资源泄漏、权限不足等;

[4].  配合 vmstat 排查瓶颈:当 vmstat 发现 b 值过高(进程阻塞)时,用 strace 跟踪阻塞进程,定位具体阻塞原因(如IO等待、锁竞争)。

二 核心使用方法

strace 用法简洁,核心分为「跟踪已有进程」「跟踪新启动进程」,搭配少量常用选项,即可满足80%的排查需求。

[1]. 基础语法

strace [选项] 命令/进程PID

[2]. 最常用场景

场景1:跟踪新启动的进程(如调试脚本、应用程序)

# 格式:strace 要启动的命令strace ./test.sh  # 跟踪test.sh脚本的系统调用strace ls /mnt/nfs # 跟踪ls命令访问NFS目录的系统调用

核心作用:查看进程启动后所有系统调用,快速定位启动失败原因(如文件不存在、权限不足)。

场景2:跟踪已运行的进程(最常用,排查进程卡死/阻塞)

# 格式:strace -p 进程PID(PID可通过top/ps命令获取)strace -p 1234  # 跟踪PID为1234的进程

核心作用:当 vmstat 显示 b 值过高(有阻塞进程)时,用此命令跟踪阻塞进程,查看其卡在哪个系统调用(如 read、write、connect),定位阻塞原因(如磁盘IO、网络超时)。

[3]. 核心选项

- -p PID:跟踪指定PID的进程(最核心选项);- -o 日志文件:将跟踪结果写入文件,避免终端输出过多(适合长期跟踪);        strace -p 1234 -o strace.log  # 跟踪结果写入strace.log- -t:在输出中添加时间戳,便于定位异常发生时间;- -T:显示每个系统调用的耗时,快速定位耗时过长的调用(如IO耗时过高);- -e 过滤条件:只跟踪指定类型的系统调用(减少冗余输出),常用过滤:        strace -p 1234 -e trace=file  # 只跟踪文件相关调用(open、read、write)strace -p 1234 -e trace=network # 只跟踪网络相关调用(connect、send、recv)strace -p 1234 -e trace=io # 只跟踪IO相关调用(read、write、readv)

三 如何通过strace定位异常


strace 输出核心是「系统调用+返回值」,无需看懂所有内容,重点关注2点即可:

[1]. 看“卡住的系统调用”

若跟踪时,输出突然停止,最后一行显示的系统调用,就是进程阻塞的原因:

- 卡住在 read(3, ...):大概率是等待文件/IO读取(如磁盘、NFS、串口);- 卡住在 write(3, ...):大概率是磁盘写满、IO繁忙,无法写入;- 卡住在 connect(..., ...):大概率是网络连接超时、端口不通;- 卡住在 wait4(..., ...):大概率是子进程未退出,父进程等待。

[2]. 看“错误返回值”

系统调用后括号内的返回值,若为负数,说明调用失败,末尾会标注错误原因:

open("/tmp/test.txt", O_RDONLY) = -1 ENOENT (No such file or directory)# 错误解读:打开/test.txt失败,原因是文件不存在(ENOENT)

常见错误原因:

- ENOENT:文件/目录不存在;- EACCES:权限不足;- ENOSPC:磁盘空间不足;- ETIMEDOUT:网络连接超时。

四 与vmstat/top协同排查


结合此前vmstat的排查逻辑,形成完整排查流程:

[1]. 用 vmstat 排查全局瓶颈:vmstat 2 3 -> 若 b 值过高(进程阻塞),说明有进程卡壳;

[2]. 用 top 定位阻塞进程:top -o %MEM/%CPU -> 找到占用资源异常或状态为D(不可中断睡眠)的进程,记录其PID;

[3]. 用 strace 跟踪异常进程:strace -p PID -T -o strace.log -> 查看卡住的系统调用和错误信息;

[4]. 定位并解决问题:根据strace输出,解决对应问题(如创建缺失文件、释放磁盘空间、检查网络)。

五 常用技巧与注意事项

[1].终止跟踪:按 Ctrl+C 即可停止strace跟踪,不会影响被跟踪进程;

[2].减少冗余:优先用 -e 过滤系统调用,避免输出过多,提高排查效率;

[3].权限要求:跟踪系统进程(如PID<1000)需用 root 权限,否则会提示权限不足;

[4].轻量无影响:strace 对进程性能影响极小,可在生产环境临时使用,无需担心影响业务。

以上为全文内容。

往期文章(欢迎订阅技术分享栏目全部文章):

【从零开始撸内核驱动源码】:以ttyserial(串口驱动)为例,串联字符设备驱动基础知识点的学习计划
Linux内核源码顶层 Makefile分析并单独编译调试内核自带的驱动
【从零开始撸内核驱动源码】:ttynull驱动
Linux内核驱动安装失败问题调试及解决方法
Linux内核驱动源码走读之编译内核及外部驱动实操指南

“谢谢你看到这里”

这里是女程序员的笔记本

 15年+嵌入式软件工程师兼二胎宝妈

分享读书心得、工作经验,自我成长和生活方式。

希望我的文字能对你有所帮助

最新文章

随机文章