无法使用 strace 捕获文件创建

Vla*_*hin 5 linux files strace

当我make在构建目录中运行以下命令时,它几乎是空的(有问题的文件绝对不存在)

strace -f -e trace=execve,vfork,open,creat -s 1024 make <target>

完成后,文件就完全存在了。因此,它必须make是由其子进程(或它们的子进程的子进程等)或其中一个子进程创建的。

但是,当我strace为文件名或 forcreat我查找日志时,找不到负责创建此文件的系统调用。

我错过了什么?我应该监视其他系统调用吗?


编辑:

事实证明,错误出在我的 strace 命令和我的 grepping 中。所有的答案都很有帮助,谢谢大家的时间。

我实际上没有传达该文件在子目录中的信息,并且我正在使用文件名和子目录的名称进行搜索。但是由于 strace 不提供有关当前工作目录的信息,因此这种方法效果不佳(我最终通过 stracechdirrename调用来获得所需的效果)。

因此,PaulHaldane 的第一个建议是正确且切中要害的。以及 larsks 的回答,其中他实际上已经猜到了文件是如何创建的。

lar*_*sks 6

不带-e选项运行 strace ,看看是否能改善您的结果。

有多种方法可以创建文件。而不是open-ing 它,很可能任何生成该文件的工具首先打开一个临时文件,写入数据,然后在完成时重命名文件。

使用您当前的限制 ( execve,vfork,open,creat),您将不会看到这种行为。

例如,给定这个简单的 python 脚本:

import os
import tempfile

fd = tempfile.NamedTemporaryFile(dir='.', delete=False)
fd.write('this is a test\n')
fd.close()

os.rename(fd.name, 'output')
Run Code Online (Sandbox Code Playgroud)

运行strace您的参数,然后output在结果中查找不会产生任何结果:

$ strace -e trace=execve,vfork,open,creat -o trace -f -s 80 python tmptest.py
$ grep output trace
$
Run Code Online (Sandbox Code Playgroud)

但是如果我删除-e过滤器:

$ strace  -o trace -f -s 80 python tmptest.py
$ grep output trace
4523  rename("/home/lars/tmp/tmpZDwvPK", "output") = 0
Run Code Online (Sandbox Code Playgroud)

在对您的问题的评论中,Sato Katsura 提供了一个示例,在该示例中您不会在strace输出中看到目标文件名,但我认为make只要您从干净的构建环境开始运行,您就不太可能遇到这种情况。