正确命令是strace -p PID -f -e trace=process -s 256 -o logfile;trace=process捕获fork/vfork/clone/execve/exit/wait4等进程生命周期调用,需加-f追踪子进程,通过输出中[pid N]前缀识别父子关系与销毁顺序。

不能用 -E trace=process -P PID,这个写法本身是错的。
参数名和语法全错了
strace 没有 -E 这个选项,正确的是 -e(小写 e);也没有 -P 参数,正确的是 -p(小写 p,后跟 PID)。
所以第一步必须先写对命令:
strace -p 12345 -e trace=process
其中 12345 替换为实际进程 PID。
trace=process 能捕获哪些调用
这个集合专门跟踪进程生命周期相关系统调用,包括:
-
fork、vfork、clone(创建子进程) -
execve(程序替换,比如启动新二进制) -
exit、exit_group(进程退出) -
wait4、waitpid(父进程等待子进程) -
setpgid、setsid(进程组/会话控制)
注意:trace=process 不包含信号处理(如 kill、sigprocmask),如需看信号要额外加 -e trace=signal 或合并写成 -e trace=process,signal。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
必须加 -f 才能看到完整派生链
仅用 -p PID -e trace=process 只能抓到父进程自身的 fork/exec 等调用,但子进程一启动就脱离 strace 视野 —— 它们不会被自动追踪。
要真正“深度追踪物理轨迹”,必须加 -f:
strace -p 12345 -f -e trace=process -s 256 -o /tmp/process-trace.log
-
-f:让 strace 跟随所有由 fork/vfork/clone 创建的子进程 -
-s 256:避免进程名、路径等被截断(默认只显示前 32 字符) -
-o:保存到文件,防止终端刷屏丢失关键信息
如何识别父子关系与销毁顺序
输出中每行开头会带 PID(如 [pid 12346]),这是判断物理轨迹的核心线索:
- 看到
[pid 12345] clone(...)→ 表示 PID 12345 创建了新进程 - 紧接着出现
[pid 12346] execve("nginx", ...)→ 说明 12346 是刚 fork 出来的,并立刻执行了新程序 - 若后续有
[pid 12345] wait4(12346, ...)→ 表示父进程在等子进程结束 - 最后出现
[pid 12346] exit_group(0)→ 子进程终止
时间戳(加 -tt)和调用耗时(加 -T)还能帮你判断是否卡在某次 wait 或子进程 hang 死。
不复杂但容易忽略:写对参数、加 -f、看 PID 前缀、存日志分析。

















