2009-11-12 68 views
0

我使用Java JNI與Gdal。有一些服務器端應用程序構建在JNI綁定之上。如果JNI部分中存在錯誤,則整個JVM堆棧會丟失。Java JNI stackfall prevention

測試一個c/C++庫不包含會導致JVM堆棧墜落的致命錯誤的最佳方法是什麼?清理處理出現的錯誤的最佳做法是什麼?

+0

測試只能告訴你是否存在缺陷,而不是缺少缺陷。 – 2009-11-12 11:28:52

+0

它可以告訴我,如果沒有人在場嗎? :p – whatnick 2009-11-12 17:04:25

回答

2

兩件事情浮現在腦海中:

1)。如果你有任何可能將C++代碼作爲一個單獨的進程運行(使用任何RPC技術進行通信),那麼你可以躲避這個問題,儘管這是以犧牲性能爲代價的。 2)。你是在C++/JNI開發人員的憐憫。我懷疑的大部分問題都在JNI層的「皮膚」上。也就是說,我有一個相當穩定的現有庫,我用JNI包裝起來。如果我無意中將空指針傳遞給現有代碼,那麼庫會感到不安,如果我沒有檢查出空值,我也可能會遇到問題。所以我們花費了很多精力來消毒這個包裝層。任何地方都有可能出現意想不到的結果,我們增加了檢查。

當然,如果整個圖書館都是新的,那麼生活就會變得更加艱難 - 最後你只需生成健壯的代碼即可。

+0

GDAL是相對穩定的使用良好的C/C++庫。我猜,JNI包裝器部分需要更多的愛。我會研究通過「皮膚」消毒的東西。 – whatnick 2009-11-12 17:00:48

2

您是否打開了這些JVM設置?

-verbose:jni -Xcheck:jni 

我發現它們對於JNI代碼的初始開發非常有價值。

-Xcheck:jni選項激活一組圍繞JNI函數的包裝函數。包裝函數對傳入參數執行檢查。這些檢查包括:

  • 呼叫和初始化JNI的調用是否在同一個線程中。
  • 對象參數是否爲有效對象。
  • 本地或全局引用是否引用有效對象。
  • 字段的類型是否匹配Get<Type>FieldSet<Type>Field呼叫。
  • 靜態和非靜態字段ID是否有效。
  • 字符串是否有效且非空。
  • 數組元素是否爲非空值。
  • 數組元素的類型。