使用printf进行OpenJDK调试?

时间:2016-01-09 04:32:48

标签: jvm printf openjdk jvm-hotspot jvm-crash

我正在攻击OpenJDK7以实现算法。在执行此操作的过程中,我需要将调试信息输出到stdout。正如我在代码库中看到的,所有打印都是通过使用outputStream * - > print_cr()来完成的。我想知道为什么没有使用printf()?

我问这个的部分原因是因为我实际上使用了很多printf()调用。我一直在看到奇怪的错误,如随机内存损坏和随机JVM崩溃。我的printf()是否有可能是根本原因? (假设我的代码的逻辑当然没有错误)

1 个答案:

答案 0 :(得分:2)

  

为什么没有使用printf()?

HotSpot不是直接使用stdio,而是使用自己的打印和日志记录框架。这个额外的抽象层提供了以下好处:

  • 不仅可以打印到stdout,还可以打印到任意流。不同的JVM部件可以记录到单独的流(例如,用于GC日志的专用流)。
  • 有自己的格式化和缓冲实现,不分配内存或使用全局锁。
  • 控制JVM发出的所有输出。例如,所有输出都可以通过时间戳轻松补充。
  • 便于移植到不同的平台和环境。

在JDK 9中进一步改进了框架以支持JEP 158: Unified JVM Logging

  

我的printf()是否有可能是根本原因?

不,除非printf被滥用:例如:参数与格式说明符不匹配,或者在信号处理程序内调用printf。否则,使用printf进行调试是安全的。在使用HotSpot时我做了很多次。