我可以strace
像这样运行命令sleep 1
并查看它正在访问的文件是这样的:
strace -e trace=file -o strace.log sleep 1
但是,在我的机器上,许多调用的返回值为 -1,表示该文件不存在。例如:
$ grep '= -1 ENOENT' strace.log | head
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_TELEPHONE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_ADDRESS", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_NAME", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_PAPER", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
我对不存在的文件并不真正感兴趣,我想知道该进程实际找到并读取了哪些文件。除了grep -v '=-1 ENOENT'
,我怎样才能可靠地过滤掉失败的呼叫?
附录
我很惊讶地得知自 2002 年以来一直以标志strace
的形式在作品中使用此功能,这是自 5.2 版
(2019-07-12 )以来功能齐全的别名,也可从 5.6 版(2020- 04-07)。-z
-e status=successful
--successful-only
-z
从 5.2 版开始也可以使用,-Z
标志的补充-e status=failed
,它是--failed-only
5.6 版的别名。
该-z
标志最初是在 2002 年的一次提交中添加的,并在 4.5.18 版(2008-08-28 )中发布,由于它无法正常工作,它从未被记录在案。
相关链接:
只看到成功的系统调用
2002 年 11 月 2 日星期六 23:07:23 UTC
使用 strace 时,我有时喜欢查看有效的系统调用(而不是所有系统调用)。
多年来我一直在移植这个补丁,它似乎非常有用。
使用 -z 选项,您不会看到打开不存在的文件(跟踪程序实际执行的操作非常有用,而不是尝试执行)。
https://lists.strace.io/pipermail/strace-devel/2002-November/000232.html
strace:-z 选项无法正常工作
日期:2003 年 1 月 12 日星期日 09:33:01 UTC
仅跟踪失败的系统调用
创建时间:2004-03-19
[strace-4.15] 建议:-z 选项的输出暂存(仅打印成功的系统调用)/包含补丁
2017 年 1 月 17 日星期二 09:35:54 UTC
https://lists.strace.io/pipermail/strace-devel/2017-January/005941.html
[PATCH v1] 为失败/成功的系统调用实现了输出暂存
2017 年 1 月 18 日星期三 16:01:20 UTC
https://lists.strace.io/pipermail/strace-devel/2017-January/005950.html
修复 -z 选项
2018 年 2 月 28 日
[PATCH 0/3] -z 和新的 -Z 选项的阶段输出
2019 年 4 月 1 日星期一 21:13:02 UTC
https://lists.strace.io/pipermail/strace-devel/2019-April/008706.html
strace -z 标志
2019 年 6 月 10 日星期一 05:29:19 UTC
https://lists.strace.io/pipermail/strace-devel/2019-June/008808.html
除了对
strace
输出进行后处理外,没有任何东西可以忽略strace
. 添加不会太难,看看syscall_exiting_trace
.syscall.c
如果您更愿意追求后期处理的角度,Ole Tange已经为您提供了比您可能在这里获得的更全面的方式:该
tracefile
工具将运行strace
并过滤掉您需要的信息一种很好读的时尚。有关详细信息,请参阅列出程序访问的文件。该问题的另一个答案列出了其他可能的方法,包括我认为非常有用的LoggedFS 。另一种选择是使用SystemTap;例如
cat
将显示任何进程成功打开的任何文件的名称。可能的解决方案:
strace
默认情况下会打印到,stderr
因此将其重定向到stdout
.稍微更可靠的模式(即意外跳过错误行的风险略低)可能是
即复制粘贴行尾,“转义”括号(否则可能被视为特殊字符),并将特殊字符添加
$
到将模式“锚定”到行尾的末尾。我在 中找不到更好的选择
man strace
。快速而肮脏的文本操作黑客是 Unix 方式:-P。gdb
几乎可以肯定,使用自定义脚本可以做您想做的事情。然而,这是更多的工作,我没有准备这样的脚本。另一个问题引用了一个
tracefile
脚本,您可以使用该-e
选项运行该脚本。这仍然是通过解析 的输出来实现的strace
,因此它似乎也不完全可靠,但我想您可能更喜欢它。 https://gitlab.com/ole.tange/tangetools/blob/master/tracefile/tracefile