2016-01-09 57 views
0

我正在破解OpenJDK7來實現算法。在這樣做的過程中,我需要輸出調試信息到標準輸出。正如我在代碼庫中所看到的,所有的打印都是通過使用outputStream * - > print_cr()來完成的。我想知道爲什麼printf()根本不被使用?OpenJDK使用printf調試?

我之所以問這個問題的部分原因是因爲我實際上使用了很多printf()調用。我一直在看到奇怪的錯誤,如隨機內存損壞和隨機JVM崩潰。有沒有可能我的printf()是根本原因? (當然,我的代碼的邏輯當然是無缺陷的)

+0

你爲什麼要破解舊版本的OpenJDK?這是出於歷史原因嗎? –

+0

沒有特別的理由。你會推薦OpenJDK8而不是7? –

+1

我建議你再開發一個最新的Java 8或9的Java當前版本。大約一年前,Oracle放棄了Java 7的公共版本。 –

回答

2

爲什麼printf()根本沒用?

HotSpot不是直接使用stdio,而是利用自己的打印和記錄框架。這個額外的抽象層提供以下好處:

  • 允許打印不僅標準輸出,但任意流。不同的JVM部件可以登錄到單獨的流(例如GC日誌的專用流)。
  • 有自己的格式化和緩衝實現,不分配內存或使用全局鎖。
  • 控制JVM發出的所有輸出。例如,所有輸出都可以很容易地添加時間戳。
  • 便於移植到不同的平臺和環境。

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

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

否,除非printf被誤用:例如,參數與格式說明符不匹配,或在信號處理程序中調用printf。否則,使用printf進行調試是安全的。我在HotSpot上工作過很多次。