strace 是诊断进程内核行为的核心工具,支持基础启动追踪、动态附加、精准过滤、深度日志留存及错误性能增强五类高级用法,覆盖系统调用捕获、实时注入、关键路径聚焦、结构化输出与失败/耗时分析。

如果您希望深入观察一个进程在内核层面的具体行为,例如文件打开失败、网络连接阻塞或子进程异常退出,则需要借助 strace 工具捕获其系统调用序列。以下是针对不同调试场景的高级追踪方法:
一、基础启动追踪:完整捕获程序生命周期
该方法确保从 execve 系统调用开始记录全部行为,适用于诊断初始化阶段崩溃、配置加载失败或权限拒绝等早期问题。
1、在终端中执行:strace -tt -T -o startup.log ./myapp --config /etc/myapp.conf
2、添加 -v 参数以显示完整结构体(如 stat、sockaddr)和环境变量内容。
3、若程序快速退出,追加 -s 512 防止长路径或 HTTP 头被截断为“...”。
二、动态附加追踪:实时注入运行中进程
适用于无法重启的服务进程(如 nginx、redis),通过 ptrace 机制建立调试会话,获取当前系统调用快照。
1、使用 pgrep -f "redis-server" 或 pidof redis-server 获取目标 PID。
2、执行:strace -p 12345 -f -e trace=network,process,file -y -T
3、按 Ctrl+C 中断后,输出中将包含文件描述符对应路径(如 read(3/lib/redis/dump.rdb>))及每次调用耗时。
三、精准过滤追踪:聚焦关键系统调用类别
避免默认全量输出带来的信息过载,通过预定义集合或显式列举缩小分析范围,提升定位效率。
1、仅捕获与文件访问强相关的调用(含现代容器常用 openat):strace -e trace=open,openat,read,write,close,stat,fstat,lstat ./app
2、专盯网络连接行为(覆盖 TCP/UDP):strace -e trace=socket,connect,accept,accept4,sendto,recvfrom,bind ./server
3、排除高频低价值调用(如时间获取)以突出异常:strace -e trace=all -e trace=!clock_gettime,!gettimeofday,!rt_sigreturn ./app
四、深度日志留存:结构化输出便于离线审查
将高密度系统调用流持久化为可搜索文本,支持多维度筛选、错误聚类与跨时段比对。
1、分离标准输出与错误并完整写入:strace -o trace_full.log -s 512 -f ./app 2>&1
2、为每个子进程生成独立日志文件:strace -ff -o trace_split.log ./app,结果将生成 trace_split.log.1234、trace_split.log.1235 等。
3、限制单行宽度并启用相对时间戳:strace -a 60 -r -o trace_readable.log ./app
五、错误与性能增强追踪:识别失败路径与空转行为
通过返回值标记、耗时统计与上下文关联,区分正常重试与逻辑卡死,揭示隐藏的资源竞争或配置缺陷。
1、高亮所有失败系统调用(返回 -1 并带 errno):strace -z -e trace=all ./app
2、统计各调用频次与总耗时:strace -c -e trace=network,file,process ./app,结束后自动打印汇总表。
3、检测高频非阻塞轮询:strace -T -e trace=read,write,poll,epoll_wait ./app | grep 'EAGAIN\|0\.0000[01]'










