Linux では、私は間違いなく使いたいと思いますstrace
。シンプルで強力です。例えば:
$ strace -o/tmp/blah -f -eopen,read bash -c "cat ciao.txt"
要求されたコマンド-f
( /tmp/blah
.
必要に応じて、正常に読み取られたファイルのセットだけを抽出するために、後で少し処理する必要があります。たとえば、Python を使用すると、次のことができます。
import re
linere = re.compile(r'^(\d+)\s+(\w+)\(([^)]+)\)\s+\=\s*(.*)$')
def main():
openfiles = dict()
filesread = set()
with open('/tmp/blah') as f:
for line in f:
mo = linere.match(line)
if mo is None:
print "Unmatched line %r" % line
pid, command, args, results = mo.groups()
if command == 'open':
fn = args.split(',', 1)[0].strip('"')
fd = results.split(' ', 1)[0]
openfiles[fd] = fn
elif command == 'read':
if results != '0':
fd = args.split(',', 1)[0]
filesread.add(openfiles[fd])
else:
print "Unknown command %r" % command
print sorted(filesread)
これは少し単純化しすぎています (&c などの他のシステムコールを確認する必要がありますdup
) が、必要な作業の要点を示していることを願っています。私の例では、これは以下を発行します:
['/lib/libc.so.6', '/lib/libdl.so.2', '/lib/libncurses.so.5',
'/proc/meminfo', '/proc/sys/kernel/ngroups_max',
'/usr/share/locale/locale.alias', 'ciao.txt']
そのため、「データファイル」だけでなく、動的ライブラリ&cを取得するために行われたものも「読み取り」としてカウントされます...システムコールレベルでは、ほとんど違いはありません。それが必要な場合は、データ以外のファイルを除外できると思います。
私はstrace
そのような目的に非常に便利であるため、Windowsで同じ仕事をするように命じられた場合、最初の試みはStraceNTに行くことです.100 %の互換性はありません.私のPythonコード(コマンドの準備と実行、strace
および結果の後処理)でこれらの違いを説明できます。
残念ながら、私の知る限り、他の Unix システムの中には、root (スーパーユーザー) の場合にのみこの種の機能を提供するものがsudo
ありdtrace
ますdtruss
。を Mac に簡単に移植strace
する方法も、root 権限なしでそのようなタスクを実行する他の方法も知りません。