如何通过程序执行打开和关闭文件列表

How to get a list of files opened and closed by a program execution?

本文关键字:文件 列表 何通过 程序 执行      更新时间:2023-10-16

我有一个程序的源代码。源代码非常庞大,是用C/c++编写的。我有资格修改源代码,编译并执行它。

我想知道这个程序在执行时打开和关闭的所有文件的文件名。如果这个列表按照文件操作发生的顺序排序,那将是一个加分项。

我怎样才能得到这个信息?是否有一些监控工具,我需要使用或我可以注入一个库调用到c++代码来实现这一点?代码太大太复杂,无法查找每个文件的open/close调用并在那里添加printf。或者在文件打开API调用中添加伪宏也可能很困难。

请注意,这与查看进程当前打开的文件不同。我知道StackOverflow上的许多问题已经解决了这个问题(使用lsof或/proc等)。

您可以使用以下strace

$ strace -e trace=open,close -o /tmp/trace.log <your_program> <program_options>

在文件/tmp/trace.log中,您将获得所有由程序完成的打开,关闭操作。

除了strace,您还可以使用interposition来拦截打开/关闭系统调用。如果你搜索"interposition shared library linux",你也会得到很多其他的参考。

我理解您希望静态地确定给定的源代码可以打开哪些文件(对于其编译程序的多次运行)。

如果你只想在给定的运行中动态地知道它,使用Rohan回答的strace(1)和/或Kec回答的interposition library。请注意,ltrace(1)也可能很有用,而且可能更相关(因为您将跟踪stdio或c++库调用)。


首先,程序可以(很多程序都是这样做的)打开一个文件名为某个输入(或某个程序参数)的文件。那么您就不能将任意文件名添加到列表中。

您可以#define fopen#define open打印消息。你可以使用LD_PRELOAD的技巧来覆盖open, fopen

如果在c++中,程序可以使用std::ifstream等打开文件…

您可以考虑使用MELT自定义GCC编译器来帮助您…