我想要收集由应用程序打开的所有文件的列表(在我的情况下是 as/w bulder)。
'strace -f' 失败,因为它混合了来自不同分支的连续打开,例如:
13078 open("file1", O_RDONLY <unfinished ...>
13077 open("file2", O_RDONLY|O_LARGEFILE) = 3
13078 <... open resumed> ) = 3
我无法跟踪“file1”是否实际打开或因 E_NOENT 而失败。
'strace -ff' 也失败了,因为它创建了太多文件(应用程序生成了大量子进程),并且创建了 program.${pid}、program.${pid+1} 等等,大约 32k 个 fork 之后,它再次创建并重写 program.${pid}、program.${pid+1}。我可以用 Google 搜索如何增加进程编号,但无论如何我不想要这么多文件。
所以问题是,我可以使用 strace 或其他工具快速而简单地解决这个问题吗?
答案1
strace -f -eopen /path/to/cmd args ... 2>&1 | gzip > output.log.gz
如果你正在寻找一个特定的过程,而不是全部那么孩子们:
gunzip output.log.gz | head -n500 | less
读取文件直到找到您正在寻找的特定程序的进程 ID (pid),然后使用grep
。
如果你正在寻找特定的结果(例如没有 ENOENT),你可以通过 grep 将其找出来:
zgrep --invert-match ENOENT output.log.gz | less