我有一個Java應用程序,通過JNI調用遺留應用程序的大量不同的本地方法。但JVM在任何JNI調用之外的隨機位置隨堆棧轉儲崩潰。有時在GC期間崩潰,有時在課堂上課和其他地方。我懷疑一個或多個本地方法正在破壞JVM堆或其他數據結構。我需要知道這是哪個調用,所以我可以修復本地實現。如何調試JNI堆腐敗問題?
傳統應用程序是第三方DLL,我沒有源代碼和符號信息。爲了使它可以從Java調用,我構建了一個使用JNI調用約定的包裝器DLL。
完美的解決方案是一個擴展的JVM選項,強制JVM在每次JNI調用後自動檢查堆和其他數據結構的完整性。
你知道有什麼可以幫助嗎?
P.S.請不要告訴我在JVM和遺留應用程序之間建立套接字或管道層,因爲我們的要求不允許這樣做。這是關於錯誤檢測,而不是架構設計。
我假設你知道'-Xcheck:jni'? – Erik 2011-03-14 22:00:54
是的,但感謝提問。 – fernacolo 2011-04-20 21:22:13
我有同樣的問題,如果這有幫助:/我有很多數據通過JNI旅行,偶爾我會得到一個損壞的地址和數據包數據。它把整個模擬過程搞砸了,這真的很煩人。 – 2011-05-12 19:21:47