Nat*_*ver 6 system-calls strace
我可以运行strace类似的命令sleep 1
并查看它正在访问哪些文件,如下所示:
strace -e trace=file -o strace.log sleep 1
Run Code Online (Sandbox Code Playgroud)
然而,在我的机器上,许多调用的返回值为-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)
Run Code Online (Sandbox Code Playgroud)
我对不存在的文件并不真正感兴趣,我想知道进程实际找到并读取了哪些文件。除了 之外grep -v '=-1 ENOENT',我怎样才能可靠地过滤掉失败的呼叫?
我很惊讶地发现,strace自 2002 年以来,该功能已以标志的形式出现-z,它是 的别名,自版本 5.2
( 2019-07-12-e status=successful ) 起功能齐全,自版本 5.6 ( 2020- )起也可用04-07)。--successful-only
-z自版本 5.2 起也可用,该标志是 的补充-Z,它是 的别名-e status=failed,自版本 5.6 起可用--failed-only。
该-z标志首次在 2002 年的提交中添加,并在版本 4.5.18 ( 2008-08-28 ) 中发布,但从未被记录在案因为它无法正常工作。
相关链接:
只看到成功的系统调用
世界标准时间 2002 年 11 月 2 日星期六 23:07:23
使用 strace 时,我有时喜欢查看有效的系统调用(而不是所有系统调用)。
我已经移植这个补丁很多年了,它看起来非常有用。
使用 -z 选项,您不会看到不存在的文件的打开情况(对于跟踪程序实际执行的操作非常有用,而不是尝试执行)。
https://lists.strace.io/pipermail/strace-devel/2002-November/000232.html
strace:-z 选项无法正常工作
日期: 世界标准时间 2003 年 1 月 12 日星期日 09:33:01
仅跟踪失败的系统调用
创建时间:2004-03-19
[strace-4.15] 提案:-z 选项的输出暂存(仅打印成功的系统调用)/包含补丁
世界标准时间 2017 年 1 月 17 日星期二 09:35:54
https://lists.strace.io/pipermail/strace-devel/2017-January/005941.html
[PATCH v1] 为失败/成功的系统调用实现了输出分级
世界标准时间 2017 年 1 月 18 日星期三 16:01:20
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
https://lists.strace.io/pipermail/strace-devel/2019-4月/008706.html
strace -z 标志
世界标准时间 2019 年 6 月 10 日星期一 05:29:19
https://lists.strace.io/pipermail/strace-devel/2019-June/008808.html
除了对输出进行后处理之外strace,\xe2\x80\x99t 中没有任何可用于忽略失败的系统调用的东西strace。添加\xe2\x80\x99不会太难,syscall_exiting_trace看看syscall.c.
如果您\xe2\x80\x99d 宁愿追求后处理角度,Ole Tange已经以比您\xe2\x80\x99 可能到达这里更全面的方式为您解决了这个问题:该tracefile工具将运行strace并过滤以易于阅读的方式输出您\xe2\x80\x99 所需的信息。有关详细信息,请参阅列出程序访问的文件。该问题的另一个答案列出了其他可能的方法,包括我认为非常有用的LoggedFS 。
另一种选择是使用SystemTap;例如
\n\n#!/usr/bin/env stap\n\nglobal stored_filename, stored_path\n\nprobe syscall.open {\n stored_filename = filename\n}\n\nprobe syscall.open.return {\n if (execname() == "cat" && $return >= 0) {\n printf("opened %s\\n", stored_filename)\n }\n}\n\nprobe syscall.openat {\n stored_filename = filename\n stored_path = dfd_str\n}\n\nprobe syscall.openat.return {\n if (execname() == "cat" && $return >= 0) {\n printf("opened %s in %s\\n", stored_filename, stored_path)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n将显示任何进程成功打开的任何文件的名称cat。
| 归档时间: |
|
| 查看次数: |
5673 次 |
| 最近记录: |