1

私はこのようにstraceを使用しています:

strace -xf -eopen -o out_configure.log ./configure
strace -xf -eopen -o out_make.log make

次に、sedで明確なファイルリストを取得しています:

sed -n 's/.*open("\(.*\)".*)\s*=.*/\1/p' out_configure.log out_make.log | sort -u

出力例があります:

/usr/share/locale-langpack/en.utf8/LC_MESSAGES/gcc-4.6.mo
/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/gcc-4.6.mo
/usr/share/locale-langpack/en.utf8/LC_MESSAGES/grep.mo
/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/grep.mo
/usr/share/locale-langpack/en.utf8/LC_MESSAGES/make.mo
/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/make.mo
/usr/share/locale/locale.alias
/usr/share/misc/magic.mgc
/usr/x86_64-linux-gnu/lib64/libc_r.a
/usr/x86_64-linux-gnu/lib64/libc_r.so
/usr/x86_64-linux-gnu/lib64/libsendfile.a
/usr/x86_64-linux-gnu/lib64/libsendfile.so
/usr/x86_64-linux-gnu/lib64/libtruerand.a
/usr/x86_64-linux-gnu/lib64/libtruerand.so
/usr/x86_64-linux-gnu/lib64/libuuid.a
/usr/x86_64-linux-gnu/lib64/libuuid.so
util.c
util_cfgtree.c
./util_cfgtree.h
util_cfgtree.h
util_cfgtree.i
./util_cfgtree.lo
util_cfgtree.lo
util_cfgtree.loT
util_cfgtree.o
util_cfgtree.s
util_charset.c
./util_charset.h

私の問題は、フルネーム以外のエントリ (「util.c」や「./util_cfgtree.h」など) です。strace 出力でフルネームを取得する方法はありますか?

私はこのスクリプトを書きました:

#!/usr/bin/python
# coding=UTF8
import subprocess
import os

fileList = []
for dirname, dirnames, filenames in os.walk(os.path.abspath('.')):
    for filename in filenames:
        fileList.append(os.path.join(dirname, filename))

straceProcess = subprocess.Popen("strace -s 1000 -xf -o out_configure.sed.log ./configure".split(), stdout=subprocess.PIPE).communicate()[0]
straceProcess2 = subprocess.Popen("strace -s 1000 -xf -o out_make.sed.log make".split(), stdout=subprocess.PIPE).communicate()[0]


f = open("out_configure.sed.log", "r+")
n = open("out_make.sed.log", "r+")

lines = []
for l in f:
    lines.append(l)
for l in n:
    lines.append(l)

f.close()
n.close()

pids = {}

filesInUse = []
currentDir = os.path.abspath('.')
for line in lines:
    parts = line.split()

if not pids.has_key(parts[0]):
    pids[parts[0]] = currentDir

if parts[1].startswith("clone"):
    pid = parts[parts.__len__() - 1]
    if not pids.has_key(pid):
        pids[pid] = os.path.abspath(pids.get(parts[0]))


elif parts[1].startswith("chdir"):
    if parts[1].split("\"")[1].startswith("/"):
        pids[parts[0]] = os.path.abspath(parts[1].split("\"")[1])

    elif parts[1].split("\"")[1].startswith("."):
        pids[parts[0]] = os.path.abspath(pids.get(pids[parts[0]]) + '/' + parts[1].split("\"")[1])
    else:
        pids[parts[0]] = os.path.abspath(pids.get(parts[0]) + '/' + parts[1].split("\"")[1])

elif parts[1].startswith("open("):
    if parts[1].split("\"")[1].startswith("/"):
        filesInUse.append(os.path.abspath(parts[1].split("\"")[1]))
    elif parts[1].split("\"")[1].startswith("."):
        filesInUse.append(os.path.abspath(pids.get(parts[0]) + '/' + parts[1].split("\"")[1]))
    else:
        filesInUse.append(os.path.abspath(pids.get(parts[0]) + '/' + parts[1].split("\"")[1]))


for l in filesInUse:
    if l in fileList:
        fileList.remove(l)

for l in fileList:
    print  l

しかし、Python に関する私の知識は非常に貧弱です。

間違いや悪い解決策はありますか?

4

2 に答える 2

1

chdir()これを行うには、システム コールもトレースする必要があると思います。後処理はより複雑になり、現在の作業ディレクトリが変更されたときに追跡するためにそれぞれを解釈する必要があるため、おそらく後処理のためにawkperlpythonまたは別のものに切り替える必要があります。相対またはローカル (つまり、フル パスではない) の場合、現在のパスを先頭に追加し、などの調整を行う必要があります。chdir()open()../

于 2012-11-13T16:45:17.113 に答える
0

これらは、作成中のアプリケーションに関連するローカル ファイルです。

リストを別のファイルに解析し、./ で始まるもの、または / で始まらないものを探し、スクリプト内で検索を実行してパスをマップすることができます。

以下の例では、Apache をビルドしていましたが、同じファイルが隠しフォルダー (サーバー フォルダーでのビルド プロセスの一部) に表示されました。

find . -name vhost.o
./server/.libs/vhost.o
./server/vhost.o

ls  server/.libs/
config.o      core_filters.o  eoc_bucket.o    exports.o        libmain.a   listen.o  main.o        protocol.o  request.o     util_cfgtree.o  util_debug.o   util_filter.o  util.o       util_script.o  util_xml.o
connection.o  core.o          error_bucket.o  gen_test_char.o  libmain.la  log.o     mpm_common.o  provider.o  scoreboard.o  util_charset.o  util_ebcdic.o  util_md5.o     util_pcre.o  util_time.o    vhost.o

E2A: 必要なことを行うワンライナーを次に示します。

 command="sed -n 's/.*open(\"\(.*\)\".*)\s*=.*/\1/p' out_configure.log out_make.log | sort -u"; echo "remote: " && echo $command| /bin/sh|grep "^/" ;echo "______________________"; echo "local" && echo $command|/bin/sh|grep -v "^/" |xargs -I {}   find . -name  {} -print
于 2012-11-13T15:37:21.070 に答える