本文约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 对进程性能影响极小,可在生产环境临时使用,无需担心影响业务。以上为全文内容。

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助