用于java的strace或procmon等效程序 当我运行C++程序时,它说“不能打开文件”,但没有说出文件名是什么,我通常使用Strues(Linux)或PROMON(Windows)来找出它试图打开的文件,并在哪里寻找它。

用于java的strace或procmon等效程序 当我运行C++程序时,它说“不能打开文件”,但没有说出文件名是什么,我通常使用Strues(Linux)或PROMON(Windows)来找出它试图打开的文件,并在哪里寻找它。,java,linux,windows,Java,Linux,Windows,我不能用java程序实现这一点,因为所有这些都是由java虚拟机控制的。我处理的一些JAR/类具有可选的配置文件。有时,最好知道这些配置文件(如javafx程序的.css文件)是如何调用的,尤其是在没有报告错误的情况下 如果我没有访问源代码的权限,例如,当我收到一个.jar或.class文件时,是否存在strace(Linux)或procmon(windows)for java的等价物,或者是某种调试选项的组合,使java VM列出它试图打开的文件或在哪里查找文件?在Linux中尝试lsof,它

我不能用java程序实现这一点,因为所有这些都是由java虚拟机控制的。我处理的一些JAR/类具有可选的配置文件。有时,最好知道这些配置文件(如javafx程序的.css文件)是如何调用的,尤其是在没有报告错误的情况下


如果我没有访问源代码的权限,例如,当我收到一个.jar或.class文件时,是否存在strace(Linux)或procmon(windows)for java的等价物,或者是某种调试选项的组合,使java VM列出它试图打开的文件或在哪里查找文件?

在Linux中尝试lsof,它可以列出进程打开的文件 如果它是你想要的, 或者,您可以始终附加JVM调试器。
或者,如果您对java类加载器了解更多,您可以使用它来了解

经过一番周旋之后,它看起来又回到了战略

strace -f java xxx | egrep openat 1> files.log 2>&1
然后查看files.log。我不理解的是java将可执行文件作为一个不同的进程启动。strace-f也跟踪分叉过程


openat是打开文件的调用。在类、jar和.so文件上有很多打开。一旦这些文件被取出,剩下的就是所有其他文件。

strace怎么了?java进程只是另一个进程,它像任何其他进程一样使用内核调用打开文件。我完全同意——我认为甚至有一些技术可以让strace/dtrace理解字节码级别上发生的事情。您可能想搜索se-radio.net播客-dtrace上有一集也谈到了使用它调试Java应用程序。也许我运行的strace不正确,但我甚至看不到正在加载的jar或类文件:只是一堆.so文件,就这样。我来看看dtrace-在尝试之前没有使用过该工具lsof-它只列出打开的文件。我正在查找它试图打开但找不到的文件。我将玩一玩jdb,看看它能告诉我什么。如果它不是一个大罐子,你可以打开里面的文件,搜索像文件名这样的字符串,它可能会帮助你找到它