strace 解释选定的系统调用边界
strace 在选定 Linux 进程与内核之间的边界上观察系统调用和信号,不需要重新构建程序,就能展示尝试访问的路径、参数、返回值和错误。应用日志漏掉操作时,这些证据很有帮助;但它不会暴露每个用户态决定,也不会自动指出哪次失败调用导致最终结果。正确诊断仍需把边界行为与程序控制流程联系起来。 这里展示原文样例的两组受控结果,并非新采集的追踪。同一错误在不同控制流程中意义不同。图中仅展示选定进程与系统调用边界,不代表全部应用工作或完整因果链。当前审核仍为已修订、执行受阻;本次未尝试追踪。 坏掉的样子 父进程可能启动子进程执行真正工作。只追踪父进程,会看到等待和退出,却漏掉子进程中的文件打开失败。使用 -f 跟随新建进程可以扩大范围,但不会自动追踪所有既有兄弟进程或请求涉及的外部服务。被选中的进程集合,本身就是证据范围的一部分,不能只看到主命令被追踪就认定全部参与者都在视野内。 错误返回不一定是根因。程序经常尝试可选文件、搜索多个位置,并从预期失败中恢复。找到第一条 ENOENT,或者退出前最后一次不成功调用,都不能替代理解应用控制流程。真正需要回答的是,这个返回值如何影响正在调查的操作。相同错误名在不同分支里,可能分别代表正常探测和不可继续的条件。 过滤与计时也会改变解释。把输出限制为文件打开,就有意排除了网络及其他活动。追踪还可能改变调度和延迟,尤其影响系统调用频繁的工作负载,没有通用固定降速倍数。过滤后的记录看起来正常,不能证明被排除操作成功,也不能证明没有追踪器时会出现完全相同的竞争时序。 快速验证 本轮复核没有重复追踪集成。所述结果来自此前环境,不证明每个容器都允许 ptrace。 把脚本保存为 straceprobe.py,在安装 strace 的一次性 Linux 环境中运行 python3 straceprobe.py。实测使用 Linux 6.12.76、Python 3.11.2 和 strace 6.1。样本启动自己的无害程序,使用临时配置路径,并要求环境允许追踪新启动子进程: ...