在排查线上问题时,你有没有遇到过这种场景:
程序卡住了,但 CPU 不高
接口很慢,但代码看起来没问题
某个文件“明明存在”,却总是报错
服务启动失败,但日志啥也没说
这时候,如果你还在疯狂加日志、猜测问题,那说明你还没用好一个神器:
👉 strace
它不是普通工具,它是——直接观察程序“在内核层做了什么”的能力
一句话总结:
strace = 观察进程所有系统调用的工具
Linux 中,应用程序无法直接操作硬件,它必须通过系统调用(syscall)与内核交互,比如:
而 strace 做的事情就是:
👉 把这些系统调用“实时打印出来”
strace ls你会看到类似输出:
execve("/bin/ls", ["ls"], 0x7ffd...) = 0openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY) = 3read(3, "...", 832) = 832close(3) = 0
解释一下:
execve:启动 ls
openat:打开文件
read:读取文件
close:关闭文件
👉 这就是 ls 在系统层面的真实行为
因为它能解决 代码看不到的问题
strace -p <pid>如果你看到:
futex(0x..., FUTEX_WAIT, ...) = ?说明:
👉 线程在锁等待(可能死锁)
strace -tt -p <pid>输出:
12:01:01 connect(...)12:01:05 connect(...)
👉 4秒卡在 connect
说明:
👉 网络问题,而不是代码问题
openat(AT_FDCWD, "/data/config.yaml", O_RDONLY) = -1 ENOENT👉 直接定位:
路径错误
权限问题
文件没挂载
strace ./app你会看到:
open("/lib/libxxx.so", ...) = -1 ENOENT👉 结论:
👉 缺少动态库
strace -p 1234strace -e trace=network -p 1234可选类型:
network → 网络
file → 文件
process → 进程
ipc → 进程通信
👉 避免信息爆炸
strace -T -p 1234输出:
read(...) = 1024 <0.0021>👉 每个系统调用耗时
strace -tt👉 用于性能分析
strace -c -p 1234输出:
% time calls syscall------ ----- -------80.00 10000 futex
👉 一眼看出瓶颈
strace -o trace.log -p 1234👉 避免污染终端
strace 基于 Linux 的:
👉 ptrace 机制
核心流程:
挂载到目标进程
拦截系统调用入口
获取参数
执行系统调用
获取返回值
简单来说:
strace = “在系统调用边界打断点”
线上疑难问题
黑盒程序分析
性能瓶颈定位
容器/微服务问题
性能开销较大
不要长时间开启
可能影响程序行为
特别是高并发系统
需要权限
通常需要 root
👉 一句话:
strace 是“最直接、最粗暴、最有效”的调试工具
问题:
Java 服务 CPU 不高,但接口极慢
排查:
strace -tt -p <pid>发现:
connect(...) <3.002s>结论:
👉 DNS 解析慢
最终原因:
/etc/resolv.conf 配置错误
记住这句话:
代码告诉你“你以为在做什么”strace 告诉你“程序实际上做了什么”
参考链接:https://strace.io/