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
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 đề.
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.
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.
bạn đã thử 'strace' chưa? – mattn
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
@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