我正在破解 OpenJDK7 来实现一个算法。在执行此操作的过程中,我需要将调试信息输出到标准输出。正如我在代码库中看到的,所有打印都是通过使用 outputStream*->print_cr() 完成的。我想知道为什么根本不使用 printf() ?
我问这个问题的部分原因是因为我实际上使用了很多 printf() 调用。我一直看到一些奇怪的错误,例如随机内存损坏和随机 JVM 崩溃。我的 printf() 是否有可能是根本原因? (当然假设我的代码逻辑没有错误)
最佳答案
why printf() was not used at all?
HotSpot 不直接使用 stdio
,而是利用自己的打印和日志记录框架。这个额外的抽象层具有以下优点:
- 不仅允许打印到标准输出,还允许打印到任意流。不同的 JVM 部分可能会记录到单独的流(例如 GC 日志的专用流)。
- 有自己的格式化和缓冲实现,不分配内存或使用全局锁。
- 控制 JVM 发出的所有输出。例如,所有输出都可以轻松地用时间戳进行补充。
- 便于移植到不同的平台和环境。
该框架在 JDK 9 中得到进一步改进,支持JEP 158: Unified JVM Logging .
Is there any chance that my printf() is the root cause?
不可以,除非 printf
被误用:例如参数与格式说明符不匹配,或者在信号处理程序内部调用了 printf。否则,使用 printf 进行调试是安全的。我在 HotSpot 工作时做过很多次。
关于jvm - OpenJDK 使用 printf 进行调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689697/