2012-11-30 54 views
5

Tôi có một chương trình đa tiến trình chạy trên CPU MIPS với uclibc và được biên dịch bằng gcc 4.5.3. Một trong những quy trình (tên là "tv") yêu cầu liên kết với một thư viện được chia sẻ (libtest.so) cũng được viết bởi tôi. Quá trình "tv" được viết bằng C++ và libtest.so nằm trong C.Cách gỡ lỗi tải thư viện được chia sẻ

Tôi cũng đã đổ tiêu đề elf khỏi libtest.so, nó có cả bộ cờ PIC và CPIC, vì vậy tôi nghĩ rằng việc tạo thư viện OK.

Khi tôi cố gắng chạy chương trình, tất cả các quá trình bắt đầu tốt ngoại trừ quá trình "tv". Không có thông báo lỗi. Khi tôi sử dụng ps để kiểm tra trạng thái của nó, nó đã trở thành một quá trình zombie.

Tôi đã thử những điều sau

  1. Nếu tôi loại bỏ các libtest.so từ quá trình liên kết, và loại bỏ bất kỳ tham chiếu đến libtest.so, các "tv" quá trình có thể chạy mà không có bất kỳ vấn đề.

  2. Nếu tôi xóa mọi tham chiếu đến libtest.so NHƯNG giữ libtest.so trong quá trình liên kết, quá trình "tv" vẫn không chạy.

  3. Tôi đã cố gắng sử dụng LD_DEBUG = tất cả để gỡ lỗi, nhưng nó không hoạt động trong bảng của tôi vì không có đầu ra hợp lệ.

Vì vậy, tôi đoán có sự cố xảy ra khi ld thử tải libtest.so khi quá trình "tv" bắt đầu. Nhưng tôi không biết làm thế nào để gỡ lỗi? Làm cách nào để tìm hiểu xem phần nào của libtest.so có gây ra sự cố không?

Bất kỳ đề xuất nào đều được hoan nghênh. Cảm ơn trước.

+1

bạn đã thử 'strace' chưa? – mattn

+2

Hmm, câu hỏi rất thú vị. Bạn dường như có lợi thế lớn trong việc kiểm soát libtest - vì vậy bạn có thể cố gắng tạo lại vấn đề với một quy trình đơn giản (không phải TV), sau đó từ từ loại bỏ mọi thứ ra khỏi libtest cho đến khi vấn đề biến mất, sau đó thêm lại cho đến khi bạn có thể xác định vấn đề (kiểu tìm kiếm nhị phân). Trừ khi vấn đề hóa ra là có thể tái sản xuất * chỉ * với tv và một libtest.so chưa sửa đổi, trong trường hợp đó, chúc may mắn? – Cameron

+0

@mattn Tôi đã sử dụng strace và tìm ra tôi đang nhận được SIGBUS. Bây giờ tôi sẽ cố gắng tìm ra nguyên nhân gây ra điều này. Cảm ơn bạn rất nhiều vì gợi ý. – SSC

Trả lời

0

Đảm bảo điều này không liên quan đến việc bỏ lỡ khai báo extern C cho API của bạn để được gọi là hàm C.

+0

Tôi chắc chắn nó không phải là do thiếu "C" khai báo bên ngoài, bởi vì mối liên kết sẽ không liên kết như tên chức năng sẽ được thay đổi bởi trình biên dịch C++. – SSC

+0

libtest.so của bạn được biên dịch với trình biên dịch C để các tên hàm sẽ không bị xáo trộn.Tôi tự hỏi nếu khi bạn biên dịch ứng dụng truyền hình của bạn như thế nào trình biên dịch C++ sẽ hành xử nếu tập tin tiêu đề của bạn xuất khẩu libtest.so API không có khai báo "C" bên ngoài. [tham khảo] (http://dsc.sun.com/solaris/articles/mixing.html#c_from_cpp) –

0

Bạn gặp lỗi trong quá trình tải. Vì vậy, viết ứng dụng đơn giản nhất mà tải thư viện của bạn và unloads nó immediatelly và gỡ lỗi nó.

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