有關密切相關的問題的信息,請參閱MSO問題A long list of possible duplicates — C memory allocation and overrunning bounds。面對錯誤「*** glibc detected *** free():invalid next size(fast)」
開發環境:CentOS的4.7,KDevelop的3.1.1,GCC 3.4.6
我運行加載一個C++使用JNI共享庫的Java測試客戶端。有三個組成部分在我的應用程序,
- Java客戶端
- C++共享充當JNI包裝庫。 (我將它稱爲「wrapperlibrary」)
- 包含業務對象的C++共享庫。 (我會稱之爲「businesslibrary」)
當我運行客戶端時,我經常遇到一個錯誤,即*** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
。這個錯誤大約需要10 - 11次,然後運行應用程序。
在我的Java客戶端,我第一次加載所需的C++庫在靜態構造函數如下,
static
{
System.Load("/root/Desktop/libs/businesslibrary");
System.out.println("business library loaded");
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
聲明「企業庫加載」被印在控制檯上之後卻錯誤*** glibc...
來。
在wrapperlibrary的項目設置中,businesslibrary被指定爲從屬庫。所以,即使我省略了調用加載businesslibrary,只是寫,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
則首先將businesslibrary被加載(通過全局變量創建日誌看到),然後wrapperlibrary被加載。該控件返回到Java客戶端,並在控制檯上打印「包裝庫加載」語句。在此之後,有一個撥打 本地方法。但是控件永遠不會達到這個本地方法的實現。在此之前,錯誤*** glibc...
再次出現。另外,如果我插入本地方法調用如之前另一個Java類的靜態方法的調用,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string.
native method call;
--
--
}
然後Try.temp的輸出()永遠不會被打印。
這兩種方法的問題可能是什麼原因?我應該如何進行?
似乎是在你的共享庫的問題。 – Adil 2010-02-23 10:35:21
嘗試valgrind它。 – 2010-02-23 12:23:52
@Laurynas - Valgrind的向我展示了兩個錯誤,但只提到了解決甚至沒有調試版本的實際代碼。所以,不知道下一步該怎麼做。由於缺乏空間而粘貼輸出的剪輯。 == 23002 ==跳轉到無效地址在0x246到下一行表示 == 23002 ==:??? == 23002 ==地址0x246不堆棧,malloc'd或(近期)釋放 == 23002 == == 23002 ==進程以信號11(SIGSEGV)的默認動作結束終止 ==在地址0x246 ==在0x246 23002 ==用於映射區域23002 ==爲權限:??? – 2010-02-26 14:04:58