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

I think in order to do this, you would also need to trace the chdir() system calls. Post-processing would be more complicated, and you would probably need to switch to awk, perl, python or something else for the post processing, because you would need to interpret each chdir() to track the current working directory as it changes, then, for open() calls that are either relative or local (i.e. not a full path), you would need to prepend the current path and make any adjustments for things like ../, etc.

于 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 回答