2010-02-23 85 views
10

有關密切相關的問題的信息,請參閱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測試客戶端。有三個組成部分在我的應用程序,

  1. Java客戶端
  2. C++共享充當JNI包裝庫。 (我將它稱爲「wrapperlibrary」)
  3. 包含業務對象的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的輸出()永遠不會被打印。

這兩種方法的問題可能是什麼原因?我應該如何進行?

+0

似乎是在你的共享庫的問題。 – Adil 2010-02-23 10:35:21

+1

嘗試valgrind它。 – 2010-02-23 12:23:52

+0

@Laurynas - Valgrind的向我展示了兩個錯誤,但只提到了解決甚至沒有調試版本的實際代碼。所以,不知道下一步該怎麼做。由於缺乏空間而粘貼輸出的剪輯。 == 23002 ==跳轉到無效地址在0x246到下一行表示 == 23002 ==:??? == 23002 ==地址0x246不堆棧,malloc'd或(近期)釋放 == 23002 == == 23002 ==進程以信號11(SIGSEGV)的默認動作結束終止 ==在地址0x246 ==在0x246 23002 ==用於映射區域23002 ==爲權限:??? – 2010-02-26 14:04:58

回答

3

這可能是因爲Java本身鏈接到與您的庫不同的glibc,或者這些庫鏈接到不同的/不同的glibcs​​。
還要檢查其中一個庫是否與glibc的調試版本鏈接(在使用C++運行庫lib的windows上問題)。 嘗試將您的庫靜態地鏈接到glibc,或者爲了排除將包裝器和業務庫靜態鏈接到一個庫中的可能性。

+0

解決方案有點類似於你的建議 - 它涉及到鏈接。因爲它使用2個字節的Unicode,所以商業庫有自己的寬字符apis重寫實現。預計會鏈接到這些apis,而是動態鏈接到期望大小爲4的系統apis。我已更改覆蓋的apis的名稱以更正此問題。現在包裝器和商業庫都與重寫的apis鏈接。謝謝。 – 2010-04-20 14:03:13

+0

@HS:如果您自己解決問題,則可以將解決方案作爲答案發布並接受,以便其他人可以找到答案。 – 2011-01-20 09:32:37

1

我幾次遇到這個神祕的錯誤。

在每種情況下,它都是由引用數組成員之外的數組成員引起的。該參考沒有導致分段錯誤,因爲它仍然在程序中另一個數組的範圍內。然而,當我去釋放數組時,事情已經搞砸了,導致這個錯誤。

此修復程序是非常仔細地檢查每個陣列正確分配,以及向數組成員引用從來沒有出界了。

相關問題