Java 记录所有JVM文件访问尝试

Java 记录所有JVM文件访问尝试,java,trace,Java,Trace,在一个不支持任何有用的日志记录工具(如strace或dtrace)的平台上,我希望有效地执行以下操作: strace-eopen-Ff javafoo 2>&1 | grep-i open | grep someFile.xml 但我不能,因为我不能在这个平台上使用strace或任何类似的工具 上面的strace命令在Linux上的作用是,每次进程尝试调用绝对路径包含someFile.xml的文件时,不管代码的位置或性质如何,它都会记录该进程的日志,而Linux不是我在本例中使用的平台。对于我的

在一个不支持任何有用的日志记录工具(如strace或dtrace)的平台上,我希望有效地执行以下操作:

strace-eopen-Ff javafoo 2>&1 | grep-i open | grep someFile.xml

但我不能,因为我不能在这个平台上使用strace或任何类似的工具

上面的strace命令在Linux上的作用是,每次进程尝试调用绝对路径包含someFile.xml的文件时,不管代码的位置或性质如何,它都会记录该进程的日志,而Linux不是我在本例中使用的平台。对于我的用例来说,strace工具会告诉我传递给open调用的完整参数,其中包括试图打开的文件的绝对路径,以及调用成功与否的返回值

我想从Java本身来做这件事。在不使用操作系统的情况下,有没有办法做到这一点

如果不可能,我可以不捕获可能尝试访问路径的本机代码,例如通过JNA/JNI调用的库。只要我能在java.io或javax.nio类试图打开文件时捕获,基本上是纯java API,用于一般用途的文件访问,我就可以这样做

我无法捕获FileNotFoundException或任何东西,因为代码似乎正在捕获FileNotFoundException,并使用自定义运行时异常重新抛出它,该异常基本上表示我找不到此文件

问题是,我不知道该文件应该放在哪里,因此代码可以在文件系统树中找到它。代码本身没有提供任何详细的选项,也没有任何方法让它告诉我它试图访问的绝对路径是什么,但它找不到

此外,即使在我正在运行的平台上,使用调试器也不方便

我不能说我使用的是什么平台,但我可以说JVM是一个通过Oracle for Java SE 7和Java EE 6的IBM JDK,因此标准中的任何内容都应该可以工作,甚至一些特定于Sun/Oracle Hotspot JVM的内容也可能会得到支持,我想至少尝试一下

-


纯Java答案本身对我来说很有价值。然而,我也有同样的问题,但对于在同一JVM上运行的Jython代码,Python代码是否与纯Java有任何不同。

我认为SecurityManager可能是您最好的选择。它应该是可用的,并且具有所需的访问权限。但是现在已经过了午夜,我现在无法提供更完整的答案。所以你没有strace。lsof呢?看到了吗?你能本着这样的精神使用AOP吗?@hoipolloi不,它是一个非UNIX、非Windows的操作系统。我不知道他们是怎么通过TCK的。这个平台是不透明的,没有任何东西是可观察或可调试的,使用它是一门黑色艺术。