我如何知道程序正在尝试访问哪个文件?

我如何知道程序正在尝试访问哪个文件?

我有一个正在尝试运行的程序,但是当我运行它时,它只是抱怨说找不到特定的文件。

但是我不知道它试图在哪个文件夹中找到这个特定的文件。我有所需文件的副本,我只需要知道将它复制到哪个文件夹中。

有没有办法可以实时显示哪些文件正在被访问或者哪些文件正在尝试访问但访问失败?

如果有帮助的话我正在使用 Ext4 文件系统。

谢谢

答案1

(我首先在这个帖子中发布了我的答案askubuntu 问题,但将其从那里删除并发布到这里,因为它更相关。)

有几种方法可以调查进程打开了哪些文件和库;主要工具是lsofstraceltrace有时需要使用 来运行它们sudo,这样程序就可以访问它所需的一切,以获得程序正在调用的内容的准确快照。

1)lsof您需要找到想要查询的进程ID,因此使用,例如:

lsof -c firefox

这将列出所有已打开的文件firefox及其对系统共享库的所有调用。(Firefox 当前在我的系统上的 pid 为 3310,因此您也可以使用lsof -p 3310,但您必须先使用 查找进程 id ps aux | grep [f]irefox )。有关的详细信息,请lsof参阅此有用的IBM 文章

2)ltracestrace具有非常相似的功能和选项,并且对于查找有关进程正在进行的调用的详细信息非常有用。主要区别在于ltrace通常只跟踪library调用(尽管它可以用选项跟踪系统调用-S),而strace跟踪两者library和其他system调用。有关跟踪进程的更多信息,请参阅这篇 IBM 文章.Lsof如果您想检查已经运行的进程,可能对您更有用,但strace也可以这样做,并在给定进程 pid 时实时监视调用(当附加到进程时总是使用 sudo):

sudo strace -p 3310

启动该程序并查看调用的内容会更有用strace,如下例所示:

strace -f -e trace=open /usr/bin/firefox

您可以只运行strace目标进程而不使用任何选项,但这里的开关意味着跟踪子进程(-f)并且跟踪所有打开的系统调用(-e trace=open)如果您想将输出保存到文件,您可以-o ~/firefox.trace在指定之前指定/usr/bin/firefox

例如,如果您想要一个库调用的摘要列表,您可以使用

ltrace -c /usr/bin/leafpad

然后退出程序,列表就会生成。-c省略实时查看通话的选项。

strace和的结果ltrace可能对您没有太大用处,因为除非您知道要查找什么,否则它们很难破译,但lsof应该提供一些基本的有用信息。

答案2

最简单的方法似乎是运行程序strace并观察 stat64() 调用(获取文件信息)或打开文件的 open() 调用。

所以你也是:

strace -e stat64 -e open [program name]

并在结果输出中查找:

(没有这样的文件或目录)

它尝试打开的路径应该位于这个错误的左边。

相关内容