使用 printf 进行 OpenJDK 调试?
OpenJDK debug with printf?
我正在破解 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 工作时我做了很多次。
我正在破解 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 工作时我做了很多次。