付録

付録

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

旗銀-z2002年の提出に初めて追加バージョン4.5.18(2008-08-28)、やや決してファイルに書き込む正しく動作しないからです。

関連リンク:

ベストアンサー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

おすすめ記事