当我运行一个C++程序时,它显示“无法打开文件”,但没有说出文件名是什么,我通常使用strace (Linux)或procmon(Windows)来找出它试图打开哪个文件以及在哪里查找它。
我不能用java程序做到这一点,因为所有这些都是由java vm控制的。我处理的一些jars/类都有配置文件,这些文件是可选的。有时,知道这些配置文件(比如javafx程序的.css文件)的名称会很好,尤其是在没有错误报告的情况下。
如果我不能访问源代码,例如,当我得到一个.jar或.class文件时,有没有等同于strace (Linux)或procmon (windows)的java,或者是某种调试选项的组合,让java VM列出它试图打开的文件或在哪里查找这些文件?
发布于 2018-01-15 19:16:15
在折腾了很久之后,看起来它又回到了strace。
strace -f java xxx | egrep openat 1> files.log 2>&1然后看看files.log。我不喜欢的是java将可执行文件作为一个不同的进程启动。strace -f也会跟踪派生的进程。
openat是打开文件的调用。有许多打开的类,jar和.so文件。一旦这些文件被取出,剩下的就是所有其他的文件。
发布于 2018-01-13 16:31:29
在linux中尝试使用lsof,它可以列出进程打开的文件,如果它是您想要的文件,或者您可以随时附加JVM调试器。或者如果你对java类加载器有更多的了解,你可以用它来找出答案。
https://stackoverflow.com/questions/48238198
复制相似问题