2016-03-06 41 views
1

在我的項目中,crypto(AES,Blowfish)算法在C中作爲共享庫實現,並由Java作爲JNI接口調用。通過使用Valgrind,共享庫沒有內存泄漏。但是,在Java端進行壓力測試時,JVM偶爾分解,找到原因非常困難。錯誤日誌表明GCthread崩潰了,我將看看GC。加密JNI在壓力測試中崩潰

請給我一些提示如何解決這類問題。非常感謝你。

從錯誤日誌的一些信息:

當前線程(0x00007fc1e3002800):GCTaskThread [堆棧:0x000070000021d000,0x000070000031d000] [ID = 9219]

SIGINFO:si_signo = SIGSEGV:si_errno = 0,si_code = 1(SEGV_MAPERR),si_addr = 0x00007fc104000280

+0

「分解」是一個非常模糊的術語。你可能有堆棧跟蹤,或者其他東西。崩潰的原因之一可能與多線程訪問某些共享數據結構有關。你的壓力測試是否使用許多並行線程? –

+0

感謝您的回覆。測試程序是單線程的。 「分解」意味着崩潰;儘管我可以獲取堆棧跟蹤,但它包含的信息太多,很難確定導致崩潰的代碼。測試程序使用以下代碼進行測試:while(1){aes_cipher_encrpyt(input,output ...)// JNI here} – frogcd

+0

因此,它更像是重複測試(您是否有隨機輸入?)而不是壓力測試。隨機數據偶然失敗的原因之一可能是(a)數據格式不正確,或者(b)您遇到解析器失敗的一些特殊情況。每次循環運行完全相同數據的緊密循環時,是否會發生相同的偶然崩潰? –

回答

0

事實證明,我們的C代碼存在Valgrind發現的內存缺陷。強烈建議使用分析工具(例如Valgrind)嚴格測試C代碼的內存佔用情況。