strace通过-p pid可动态追踪运行中进程,常用-e trace=network,io过滤调用、-f跟踪子进程、-s 256扩大字符串截断长度、-o保存日志;需显式指定file/network等集合或具体系统调用如openat、connect,注意内核和strace版本兼容性。

strace 怎么看某个进程在干啥
直接 attach 到运行中的进程,用 -p 参数最常用。比如发现 nginx 响应变慢,先查 PID:pgrep nginx,再执行 strace -p 12345 -e trace=network,io —— 这样只抓网络和 I/O 系统调用,避免日志爆炸。
常见错误是没加 -e trace=... 就直接跑,结果输出全是 read、write、clock_gettime,根本没法定位问题。默认会跟踪所有系统调用,噪音极大。
- 加
-f才能跟踪子进程(比如 fork 后的 worker) -
-s 256把字符串参数截断长度从默认 32 改大,否则看不到完整路径或 HTTP header - 想保存到文件?用
-o /tmp/trace.log,别用重定向(会丢掉 stderr 中的关键错误信息)
strace 抓不到 open 或 connect 是为啥
不是没发生,是默认过滤掉了。open、connect 这类调用属于 file 和 network 类别,但 strace 不自动展开这些类别名——必须显式指定。
正确写法是:strace -e trace=open,openat,connect,accept4,或者用预定义集合:strace -e trace=file,network。注意不同内核版本对集合支持略有差异,Ubuntu 22.04+ 和较新 kernel 支持较好,CentOS 7 的 strace 版本老,file 集合可能不含 openat。
-
openat在现代程序中比open更常用(尤其容器环境),漏掉它就看不到大部分文件打开行为 -
connect不包含 UDP,要抓 UDP 连接得加sendto、recvfrom - 如果目标进程用了 seccomp 或 ptrace restrictions(如某些容器 runtime),
strace可能被直接拒绝,报错Operation not permitted
strace 输出里看到 EAGAIN 或 EWOULDBLOCK 怎么办
这是正常现象,不是错误。表示系统调用因非阻塞模式立即返回失败,程序自己会重试或转去 poll/epoll 等待。但如果高频出现(比如每秒几百次 read 返回 EAGAIN),说明程序在轮询而非等待事件,可能是逻辑卡死或配置不当。
方科网络ERP图文店II版为仿代码站独立研发的网络版ERP销售程序。本本版本为方科网络ERP图文店版的简化版,去除了部分不同用的功能,使得系统更加精炼实用。考虑到图文店的特殊情况,本系统并未制作出入库功能,而是将销售作为重头,使用本系统,可以有效解决大型图文店员工多,换班数量多,订单混杂不清的情况。下单、取件、结算分别记录操作人员,真正做到订单全程跟踪!无限用户级别,不同的用户级别可以设置不同的价
关键看上下文:跟在 epoll_wait 后面的 read 出现 EAGAIN 是健康信号;但如果没有 epoll_wait,只有反复 read + EAGAIN,大概率是程序没正确处理 I/O 多路复用。
-
strace -T显示每次调用耗时,有助于判断是否真在空转(比如read总是 0.000001s 返回EAGAIN) -
-y参数能显示文件描述符对应的路径(如read(3→read(3/12345/fd/3>),方便确认操作对象 - 注意区分
EAGAIN和ETIMEDOUT:后者才是真正的超时,通常意味着下游服务无响应
strace 跟踪启动阶段的程序怎么写命令
用 strace 直接跑命令即可,不用先启动再 attach。例如调试 Python 脚本启动卡住:strace -f -e trace=process,file,signal python3 app.py。
重点在 -f 和 trace=process:前者确保跟踪 fork 出的子进程,后者能看见 clone、execve、exit_group,帮你确认程序是否成功 exec 到目标二进制,还是卡在动态库加载或 interpreter 初始化。
- 如果程序启动后立刻退出,加
-v(详细模式)看execve参数是否正确,比如路径错、缺少 so、或架构不匹配(aarch64 二进制跑在 x86 容器里) -
LD_DEBUG=libs和strace配合用更准:前者看动态链接过程,后者看系统调用层面的 open/mmap 行为 - 避免在生产环境长时间全量跟踪
execve,因为每个新进程都会触发大量输出,容易压垮终端或磁盘
真正难的是区分「系统调用失败」和「程序逻辑错误」——strace 只告诉你系统层发生了什么,不解释业务含义。比如看到一百次 stat("/etc/ssl/certs", ...) 失败,得结合代码确认是硬编码路径、chroot 环境缺失,还是容器挂载遗漏。这点容易被忽略。









