我有一个程序的源代码。源代码非常庞大,用C / C ++编写。我有修改源代码的凭据,编译并执行它。
我想知道执行该程序时打开和关闭的所有文件的文件名。如果此列表按文件操作发生的顺序排序,那将是一个加号。
如何获取此信息?是否有一些我需要使用的监控工具,或者我可以将库调用注入C ++代码来实现这一目标吗?代码太大而且很复杂,无法搜索每个文件打开/关闭调用并在那里添加printf。或者在文件打开API调用中添加伪宏也可能很困难。
请注意,这与查看进程当前打开的文件不同。我知道StackOverflow上已经解决了这个问题的许多问题(使用lsof或/ proc等)。
答案 0 :(得分:3)
您可以使用strace
,如下所示
$ strace -e trace=open,close -o /tmp/trace.log <your_program> <program_options>
在文件/tmp/trace.log
中,您将获得程序完成的所有打开,关闭操作。
答案 1 :(得分:1)
除了strace之外,您还可以使用interposition来拦截打开/关闭系统调用。如果你谷歌为&#34;插入共享库linux&#34;你还会得到许多其他参考资料。
答案 2 :(得分:0)
我理解您要确定静态给定的源代码可以打开哪些文件(对于其编译程序的多次运行)。
如果您只想动态了解特定投放,请strace(1)和/或Rohan将interposition作为answered Kec的答案ltrace(1) }。请注意,std::ifstream也可能有用,也许更相关(因为您将跟踪stdio
或C ++库调用)。
首先,程序可以(并且很多程序)打开一个名称是某个输入(或某个程序参数)的文件。然后,您无法将该任意文件名添加到列表中。
您可以#define fopen
和#define open
来打印邮件。您可以使用LD_PRELOAD
技巧覆盖open
,fopen
如果在C ++中,程序可能会使用MELT等打开文件......
您可以考虑使用{{3}}自定义GCC编译器来帮助您......