我有一个应用程序(我没有的源代码),可以从这样的命令行调用
$ ./notmyapp
我想知道应用程序写入的所有位置。它输出正在调用的目录中的一些文件,但我需要确保这些文件是唯一创建的文件。
因此,我需要隔离应用程序,以找出它在运行时创建/编辑的所有文件。
我该怎么做?
使用Perl或C或C ++的某种方式?这些语言中的任何标准库都有办法实现吗?
答案 0 :(得分:24)
strace
,ktrace
/ kdump
,truss
,dtruss
或您的平台为跟踪系统调用提供的任何其他程序可能就是您所需要的寻找。
期望从这些中获得大量输出。要确定应用程序正在读取和写入的文件,您可能希望将输出限制为几个系统调用。例如strace -eopen ./notmyapp
。
应用程序也可以分叉子进程来完成它的一些工作。对于大多数系统调用跟踪器,您还必须具体跟踪这些子进程。有了strace,那就是strace -f ./notmyapp
。
答案 1 :(得分:5)
在unix系统中,您可以使用strace打印出所有系统调用的跟踪以及进程收到的信号:
$ strace ./notmyapp
grep
可用于将输出限制为系统调用的子集:
$ strace ./notmyapp 2>&1 | egrep '(open|write)'
答案 2 :(得分:2)
你可以使用strace。
答案 3 :(得分:2)
你回答rafl的回答说,notmy应该在做某事之前产生提示并等待[...]输入。
将您的输入预先放入纯文本文件(例如responses.txt
),每行一个输入。然后按照建议使用strace
来跟踪open()
内容write()
或responses.txt
的呼叫:
$ strace -eopen -ewrite ./notmyapp < responses.txt
如果您期望获得大量文件访问权限,那么您可能希望将输出通过管道传输到您喜爱的寻呼机或编辑器:
$ strace -eopen -ewrite ./notmyapp < responses.txt | vim -R -
strace
是一款功能强大的工具。有关详细信息,请参阅man strace
。
答案 4 :(得分:1)
您可以尝试以无权在任何驱动器上随处写入的用户身份运行它。然后,当它尝试创建/写入第一个文件时,您会收到一条错误消息。记录该目录/文件并为其授予写入权限,然后重复,直到没有错误消息为止。