strace可用于实时追踪程序的系统调用:一、基础追踪,用strace -p pid附加到运行进程;二、启动追踪,strace /path/to/program完整捕获;三、过滤追踪,用-e trace=指定调用类型;四、输出重定向,-o保存日志;五、高级追踪,-f跟踪子进程,-z仅显示失败调用。

如果您需要观察某个程序在运行过程中具体执行了哪些系统调用及其参数、返回值和错误信息,则可以使用 strace 工具进行实时追踪。以下是实现此目标的具体操作方法:
一、基础追踪:直接附加到正在运行的进程
该方法适用于已启动但行为异常的程序,通过其进程 ID(PID)动态注入追踪,无需重启进程。
1、使用 ps 或 pgrep 查找目标程序的 PID,例如:pgrep -f "nginx"。
2、执行 strace 命令并指定 PID:strace -p PID,其中 PID 替换为实际数值。
3、按 Ctrl+C 中断追踪,输出将显示所有被捕获的系统调用序列。
二、启动时追踪:对新进程完整捕获
该方法确保从程序入口点开始记录全部系统调用,适用于调试启动失败或初始化阶段的问题。
1、在终端中直接运行:strace /path/to/program arg1 arg2。
2、若需同时查看时间戳和调用耗时,添加选项:strace -tt -T /path/to/program。
3、输出将逐行显示每个系统调用的名称、参数、返回值及执行时间。
三、过滤追踪:聚焦特定系统调用类型
当程序调用繁多时,可通过筛选减少干扰信息,快速定位与文件、网络或信号相关的操作。
1、仅追踪 open、read、write 等文件相关调用:strace -e trace=open,read,write,close /path/to/program。
2、仅追踪 socket、connect、sendto 等网络相关调用:strace -e trace=socket,connect,sendto,recvfrom /path/to/program。
3、排除特定调用(如忽略 gettimeofday):strace -e trace=all -e trace=!gettimeofday /path/to/program。
四、输出重定向:保存追踪结果供离线分析
将大量系统调用日志写入文件,便于后续搜索、比对或多人协作审查。
1、将标准输出和标准错误同时重定向至文件:strace -o trace.log /path/to/program 2>&1。
2、追加模式写入(避免覆盖已有日志):strace -o trace.log -a 40 /path/to/program >> trace.log 2>&1。
3、限制每行输出宽度为 40 字符以提升可读性:strace -o trace.log -a 40 /path/to/program。
五、高级追踪:跟踪子进程及系统调用错误
某些程序会 fork 子进程或频繁触发错误,需启用递归跟踪与错误高亮以揭示深层问题。
1、递归跟踪所有子进程:strace -f /path/to/program。
2、仅显示失败的系统调用(返回值为 -1):strace -e trace=all -z /path/to/program。
3、结合 -v 参数显示结构体内容的完整展开(如 stat、ioctl 参数):strace -v -e trace=stat,ioctl /path/to/program。










