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 不提供有关当前工作目录的信息,因此这种方法效果不佳(我最终通过 stracechdir
和rename
调用来获得所需的效果)。
因此,PaulHaldane 的第一个建议是正确且切中要害的。以及 larsks 的回答,其中他实际上已经猜到了文件是如何创建的。
不带-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
只要您从干净的构建环境开始运行,您就不太可能遇到这种情况。