当我运行一个C ++程序,它说“无法打开文件”但没有说明文件名是什么时,我通常使用strace(Linux)或procmon(Windows)来找出它试图打开的文件它正在寻找它。
我无法用java程序执行此操作,因为所有这些都是从java vm控制的。我处理的一些jar /类具有可选的配置文件。有时,很高兴知道这些配置文件(例如javafx程序的.css文件)被调用,特别是在没有报告错误时。
如果我无法访问源代码,例如,当我获得.jar或.class文件时,是否有相当于java的strace(Linux)或procmon(windows)或者它是某种组合调试选项,让java VM列出它试图打开的文件或查找文件的位置?
答案 0 :(得分:1)
在linux中尝试lsof,它可以列出进程打开的文件 如果它是你要找的, 或者您始终可以附加JVM调试器。 或者如果您对Java类加载器有更多了解,可以使用它来查找。
答案 1 :(得分:1)
在经常搞砸之后,看起来它已经回归了。
strace -f java xxx | egrep openat 1> files.log 2>&1
然后查看files.log。我不理解的是java将可执行文件作为一个不同的进程启动。 strace -f也跟踪分叉的进程。
openat是打开文件的调用。类,jar和.so文件有很多打开。一旦取出这些,你剩下的就是所有其他文件。