0

0

Linux如何使用strace排查系统异常_Linux系统调用跟踪教程

冰川箭仙

冰川箭仙

发布时间:2025-11-23 21:22:02

|

587人浏览过

|

来源于php中文网

原创

strace是Linux系统调用跟踪工具,通过监控程序与内核的交互,可定位卡顿、崩溃、权限错误等问题。使用strace可捕获文件操作、网络连接、信号处理等行为,结合-f、-T、-p等选项能分析子进程、耗时及运行中进程,如发现bind返回EACCES即知端口权限问题,快速实现故障排查。

linux如何使用strace排查系统异常_linux系统调用跟踪教程

当Linux系统出现异常,比如某个程序卡住、运行缓慢或崩溃,却找不到明显原因时,strace 是一个非常实用的诊断工具。它能跟踪进程执行过程中的系统调用和信号,帮助你看到程序与内核之间的“对话”,从而快速定位问题根源。

什么是strace?

strace 是 Linux 下用于跟踪进程系统调用(system calls)和信号(signals)的命令行工具。系统调用是应用程序请求操作系统服务的方式,例如打开文件、读写网络、创建进程等。通过观察这些调用的行为,可以判断程序是否在等待I/O、访问了错误路径、权限不足,或者陷入死循环。

如何使用strace跟踪程序运行

最简单的用法是在启动程序时加上 strace 前缀:

  • strace ls /tmp —— 跟踪 ls 命令执行过程中的所有系统调用
  • strace -e openat,read,write ./myapp —— 只关注文件操作相关调用
  • strace -o debug.log ./server —— 将输出保存到文件,避免干扰终端

常见选项说明:

  • -f:跟踪子进程(适合多进程/多线程程序)
  • -p PID:附加到正在运行的进程(无需重启程序)
  • -T:显示每个系统调用的耗时(便于发现性能瓶颈
  • -e trace=network:只看网络相关的系统调用(如 sendto、recvfrom)
  • -y:在输出中显示文件描述符对应的文件路径(strace 较新版本支持)

通过strace识别常见问题

掌握输出解读方法,才能真正发挥 strace 的作用。以下是几种典型异常场景及排查方式:

1. 程序卡住或响应慢
使用 strace -T -p PID 附加到进程,观察最后几个系统调用。如果发现类似:

read(3, 

长时间停留在此处,说明程序在等待输入(可能是网络、管道或文件)。结合耗时字段(-T 输出),可确认是否存在阻塞。

2. 文件无法打开或权限错误
查找 openatopen 调用返回 -1:

openat(AT_FDCWD, "/etc/myconfig.conf", O_RDONLY) = -1 ENOENT (No such file or directory)

这说明程序试图读取一个不存在的配置文件。检查路径拼写、工作目录或权限设置即可修复。

3. 程序频繁失败或崩溃
查看是否有大量重复的失败调用,例如:

access("/var/run/service.lock", F_OK) = -1 ENOENT (No such file or directory)

可能程序依赖某个临时文件但未正确创建。也可能是守护进程启动顺序问题。

你好星识
你好星识

你的全能AI工作空间

下载

4. 网络连接异常
使用 strace -e trace=network -p PID 观察连接行为:

connect(4, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.168.1.100")}, 16) = -1 ECONNREFUSED (Connection refused)

明确提示连接被拒绝,应检查目标服务是否运行、防火墙规则或IP配置。

实际排查示例:Web服务启动失败

假设一个自研 Web 服务启动后立即退出,日志为空。使用 strace 跟踪:

strace -f ./webserver

输出中发现:

bind(3, {sa_family=AF_INET, sin_port=htons(80), ...}) = -1 EACCES (Permission denied)

问题浮出水面:程序尝试绑定 80 端口,但没有权限。解决方案有两个:改用大于 1024 的端口,或给程序赋予 CAP_NET_BIND_SERVICE 能力:

sudo setcap 'cap_net_bind_service=+ep' ./webserver

再次运行,服务正常启动。

基本上就这些。strace 不需要安装额外依赖,几乎所有 Linux 发行版都自带。虽然输出看起来密集,但只要聚焦关键调用(如 open、read、write、connect、bind、kill、access),就能快速锁定问题。它是系统级调试的“显微镜”,值得每位运维和开发人员掌握。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1348

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

701

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

572

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

545

2023.07.20

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.1万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号