2010-02-23 22 views
10

Vui lòng xem câu hỏi MSO A long list of possible duplicates — C memory allocation and overrunning bounds để biết thông tin về các câu hỏi có liên quan chặt chẽ.Đối mặt với lỗi "*** glibc được phát hiện *** miễn phí(): kích thước tiếp theo không hợp lệ (nhanh)"


môi trường phát triển: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6

tôi chạy một khách hàng kiểm tra Java tải một C++ chia sẻ thư viện sử dụng JNI. Có ba thành phần trong ứng dụng của tôi,

  1. Java client
  2. C++ thư viện chia sẻ mà hoạt động như một wrapper JNI. (Tôi sẽ gọi nó là "wrapperlibrary")
  3. Thư viện được chia sẻ có chứa các đối tượng kinh doanh. (Tôi sẽ gọi nó là "businesslibrary")

Khi tôi chạy máy khách, tôi gặp lỗi rất thường xuyên, là *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***. Lỗi này xảy ra trong khoảng 10 - 11 lần và sau đó ứng dụng chạy.

Trong client Java của tôi, đầu tiên tôi tải C thư viện cần thiết ++ trong một ctor tĩnh như sau,

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"); 
} 

Những tuyên bố "kinh doanh thư viện nạp" được in trên console nhưng sau khi nó trở thành lỗi *** glibc... đến.

Trong cài đặt dự án của trình bao bọc thư viện, thư viện nghiệp vụ được chỉ định làm thư viện phụ thuộc. Vì vậy, ngay cả khi tôi bỏ qua các cuộc gọi để nạp businesslibrary và chỉ cần viết,

static 
{ 
System.Load("/root/Desktop/libs/wrapperlibrary"); 
System.out.println("wrapper library loaded"); 
} 

thì trước hết các businesslibrary được nạp (nhìn qua khai thác gỗ tạo biến toàn cầu) và sau đó là wrapperlibrary được nạp. Điều khiển trả về cho máy khách java và câu lệnh "thư viện bọc nạp" được in trên bảng điều khiển. Sau đó, có một cuộc gọi đến phương thức gốc. Tuy nhiên, kiểm soát không bao giờ đạt được việc thực hiện phương pháp gốc này. Thay vào đó, lỗi *** glibc... lại xuất hiện. Ngoài ra, nếu tôi chèn một cuộc gọi đến phương thức tĩnh của một lớp java khác trước khi gọi phương thức gốc như,

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; 

-- 
-- 
} 

thì đầu ra của Try.temp() không bao giờ được in.

Điều gì có thể là lý do có thể cho vấn đề trong cả hai cách tiếp cận này và tôi nên tiến hành như thế nào?

+0

Dường như là sự cố trong thư viện được chia sẻ của bạn. – Adil

+1

Hãy thử để valgrind nó. –

+0

@Laurynas - Valgrind chỉ cho tôi hai lỗi nhưng chỉ đề cập đến các địa chỉ không phải là mã thực tế ngay cả khi xây dựng bản sửa lỗi. Vì vậy, không biết phải làm gì tiếp theo. Dán một đầu ra bị thiếu vì thiếu không gian. == 23002 == Chuyển đến địa chỉ không hợp lệ được ghi trên dòng tiếp theo == 23002 == tại 0x246: ??? == 23002 == Địa chỉ 0x246 không phải là stack'd, malloc'd hoặc (gần đây) free'd == 23002 == == 23002 == Quá trình chấm dứt với hành động mặc định của tín hiệu 11 (SIGSEGV) == 23002 == Các quyền không hợp lệ đối với vùng được ánh xạ tại địa chỉ 0x246 == 23002 == tại 0x246: ??? –

Trả lời

3

Có thể bản thân Java được liên kết với một glibc khác với thư viện của bạn hoặc các thư viện được liên kết khác nhau/với các glibcs ​​khác nhau.
Ngoài ra, hãy kiểm tra xem một trong các thư viện có đang liên kết với phiên bản gỡ lỗi của glibc (mũ có vấn đề trên cửa sổ có lib thời gian chạy C++) không. Hãy thử liên kết các thư viện của bạn tĩnh với glibc, hoặc vì mục đích loại trừ khả năng liên kết trình bao bọc và libs kinh doanh của bạn tĩnh vào một thư viện.

+0

Giải pháp này hơi giống với đề xuất của bạn - nó liên quan đến liên kết. Thư viện kinh doanh có khả năng thực thi ghi đè của nó đối với apis char rộng vì nó hoạt động trên 2 byte Unicode. Nó được dự kiến ​​sẽ liên kết đến các apis nhưng thay vì có liên kết động với hệ thống apis mà mong đợi một kích thước của 4. Tôi đã thay đổi tên của apis ghi đè để sửa lỗi này. Bây giờ cả hai wrapper và liên kết thư viện kinh doanh với apis ghi đè. Cảm ơn. –

+0

@HS: Nếu bạn tự giải quyết vấn đề, bạn có thể đăng giải pháp làm câu trả lời và chấp nhận điều đó, để người khác có thể tìm thấy giải pháp đó. –

1

Tôi đã gặp phải lỗi khó hiểu này nhiều lần.

Trong mỗi trường hợp, nguyên nhân là do tham chiếu thành viên mảng nằm ngoài mảng. Tham chiếu không gây ra lỗi phân đoạn vì nó vẫn nằm trong giới hạn của một mảng khác trong chương trình.Khi tôi đi giải phóng mảng, tuy nhiên, mọi thứ đã sai lầm đủ để ném lỗi này.

Việc sửa chữa là rất cẩn thận kiểm tra xem từng mảng đã được phân bổ đúng chưa và tham chiếu đến các thành viên mảng chưa bao giờ vượt quá giới hạn.

Các vấn đề liên quan