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,
- Java client
- C++ thư viện chia sẻ mà hoạt động như một wrapper JNI. (Tôi sẽ gọi nó là "wrapperlibrary")
- 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?
Dường như là sự cố trong thư viện được chia sẻ của bạn. – Adil
Hãy thử để valgrind nó. –
@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: ??? –