在不支持strace
或dtrace
等任何有用日志工具的平台上,我希望有效地执行以下操作:
strace -eopen -Ff java Foo 2>&1 | grep -i open | grep someFile.xml
但我不能,因为我不能在这个平台上使用strace或任何类似的实用程序。
以上strace
命令的作用(在Linux上,这不是我在这种情况下使用的平台)是每次进程记录(无论位置或代码的性质)尝试在绝对路径包含open
的文件上调用someFile.xml
系统调用。对我的用例严重,strace
工具会告诉我传递给open
调用的完整参数,其中包含绝对路径尝试打开的文件和返回值(调用是否成功)。
我想从Java本身做到这一点。没有使用操作系统设施有没有办法做到这一点?
我没有捕获可能尝试访问路径的“本机”代码,如果不可能,例如通过JNA / JNI调用的库。只要java.io
或javax.nio
类尝试打开文件(基本上是用于通用文件访问的纯Java API),我就可以陷阱。我很好。
我无法捕获FileNotFoundException
或其他任何内容,因为代码似乎正在捕获FileNotFoundException
并使用自定义运行时异常重新抛出它,基本上说“我找不到此文件! “
问题是,我不知道哪里该文件应该去,以便代码可以在文件系统树中找到它。代码本身不提供任何冗长的选项或任何方式让它告诉我它试图访问它无法找到的绝对路径。
另外,在我正在运行的平台上使用调试器并不方便(如果可能的话)。
我不能说我正在使用什么平台,但我可以说JVM是一个IBM JDK,它通过Oracle的TCK用于Java SE 7和Java EE 6,所以任何标准的一部分都应该有效,甚至一些特定于Sun / Oracle Hotspot JVM的东西也可能同时被支持(我想至少尝试一下)。
-
纯Java答案本身对我很有价值。但是,我也有同样的问题,但对于 Jython 代码(在与上面相同的JVM上运行的Python代码),如果它与纯Java完全不同。