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
ロゴの形ですべての機能を果たしたことを知って驚きました。-z
-e status=successful
バージョン5.2以降
(2019-07-12)、次にも利用可能--successful-only
バージョン5.6から(2020-04-07)。
-z
-Z
バージョン5.2以降の使用可能フラグは、バージョン5.6以降の使用可能なエイリアスであることを補完します-e status=failed
。--failed-only
旗銀-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
答え1
出力を後処理する以外はstrace
無視できるものはありませんstrace
。追加することはそれほど難しくありません。syscall_exiting_trace
内部機能を見てください。syscall.c
。
後処理の観点を追求したい場合オレデインジャーこの質問は、ここで見られるよりも包括的な方法で解決されました。tracefile
このツールはstrace
読みやすい形式で動作し、必要な情報をフィルタリングします。バラよりプログラムがアクセスするファイルのリストもっと学ぶ。もう一つの答えこの問題に記載されている他の可能なアプローチは次のとおりです。ロギングファイルシステムこれはとても便利だと思います。
別のオプションは、次のものを使用することです。システムクリック;例えば
#!/usr/bin/env stap
global stored_filename, stored_path
probe syscall.open {
stored_filename = filename
}
probe syscall.open.return {
if (execname() == "cat" && $return >= 0) {
printf("opened %s\n", stored_filename)
}
}
probe syscall.openat {
stored_filename = filename
stored_path = dfd_str
}
probe syscall.openat.return {
if (execname() == "cat" && $return >= 0) {
printf("opened %s in %s\n", stored_filename, stored_path)
}
}
すべてのプロセスで正常に開かれたファイルの名前が表示されますcat
。
答え2
考えられる解決策:
strace -e trace=file sleep 1 2>&1 | grep -v "= -1 ENOENT" > strace.log
strace
デフォルトでは で印刷されるため、stderr
にリダイレクトされますstdout
。
答え3
やや安定したモード(例:誤って行をスキップする危険性がわずかに少ない)
| grep -v "= -1 ENOENT [(]No such file or directory[)]$"
つまり、行末をコピーして貼り付け、角かっこ(それ以外の場合は特殊文字として扱うことができます)を「エスケープ」し、末尾に$
特殊文字を追加してパターンを行末に「固定」します。
でより良い選択が見つかりませんman strace
。高速で汚れたテキスト操作のトリックはUnix方式です:-P。
gdb
目的を達成するためにカスタムスクリプトを使用することはほぼ確実です。しかし、より多くの作業が必要で、まだそのようなスクリプトを準備していません。
もう1つの質問は、このオプションを使用して実行tracefile
できるスクリプトに関するものです。-e
これはまだ構文解析された出力を介して行われるため、strace
完全に信頼できませんが、あなたが好むと思いました。 https://gitlab.com/ole.tange/tangetools/blob/master/tracefile/tracefile