strace未找到需按发行版安装:ubuntu用apt install strace,rhel/centos用yum/dnf install strace,alpine用apk add strace,arch用pacman -s strace;调试卡住需检查权限、进程状态及容器cap-add;阻塞点聚焦futex/epoll_wait等调用;strace不捕获纯用户态锁,需配合pstack或gdb分析。

strace 命令没找到?先确认安装方式和包名差异
大多数现代 Linux 发行版默认不预装 strace,直接运行会提示 command not found。不同发行版的安装命令和包名不一致,别照抄一个命令硬试:
- Ubuntu/Debian:
sudo apt install strace(包名就是strace) - RHEL/CentOS 7/8:
sudo yum install strace或sudo dnf install strace - Alpine:
apk add strace - Arch Linux:
sudo pacman -S strace
注意:某些最小化安装系统(如 Docker 官方 alpine:latest)连 which 都没有,建议先用 command -v strace 确认是否存在,比 which 更可靠。
追踪进程时卡住不动?检查权限与 attach 条件
strace -p <pid></pid> 是调试死锁最常用的手段,但常卡在“等待目标进程暂停”这一步。根本原因不是工具问题,而是权限或状态限制:
- 必须与目标进程同用户,或拥有
CAP_SYS_PTRACE能力(root 用户默认有);普通用户strace -p非本主进程会报错Operation not permitted - 目标进程若已处于
T (stopped)状态(比如被 gdb 暂停过),strace -p会挂起等待其恢复——此时需先kill -CONT <pid></pid>,再重试 - 容器内调试时,宿主机 strace 容器内进程需加
--cap-add=SYS_PTRACE启动容器,否则即使 root 也失败
验证是否成功 attach:执行后无输出即正常(表示正在监听),按 Ctrl+C 可退出并打印汇总统计;若卡住超过 5 秒,优先查权限和进程状态。
死锁现场只看到 futex、epoll_wait?聚焦阻塞点而非全量日志
直接跑 strace -p <pid></pid> 往往刷屏全是 futex(0x..., FUTEX_WAIT_PRIVATE, 0, NULL) 或 epoll_wait(3, [], 128, -1),这不是 bug,是典型阻塞系统调用——说明程序卡在这儿了:
-
FUTEX_WAIT_PRIVATE表示线程在等互斥锁/条件变量,大概率是 pthread_mutex_lock 或 cond_wait 导致的用户态死锁 -
epoll_wait(..., -1)中超时为 -1,代表无限等待事件,需结合代码看是否漏了唤醒逻辑(比如写端没 close pipe、信号没发、timerfd 没触发) - 避免用
-f(跟踪子进程)或-s 0(禁截断字符串)盲目开启,会淹没关键阻塞点;先用默认参数定位卡在哪条调用,再针对性加选项
快速缩小范围:加 -e trace=futex,epoll_wait,read,write,accept 只盯 I/O 和同步原语,比全量 -e trace=all 实用得多。
strace 抓不到锁竞争?它不解析用户态锁,得配合其他工具
strace 只能看到系统调用层面的阻塞,对纯用户态锁(如 spinlock、自旋计数器、无系统调用的 busy-wait)完全透明。常见误判场景:
- 程序卡在
while(!flag);这种空转循环里,strace日志干净无阻塞调用,但 top 显示 CPU 100% - glibc 的
pthread_mutex_t在未争抢时走 fast path,不触发 futex;只有冲突时才陷入内核——所以没看到futex不等于没锁问题 - Go 程序的 goroutine 死锁由 runtime 自检,
strace看不到 channel 阻塞,只能看到底层epoll_wait或nanosleep
真要分析锁竞争,strace 只是第一站:确认是否陷入内核后,该切到 pstack <pid></pid> 看线程栈,或用 gdb -p <pid></pid> 执行 info threads + thread apply all bt 查持锁者。别指望一个工具解决所有死锁。











