2012-09-27 32 views
9

Tôi cần biết các cách để tìm ra các rò rỉ bộ nhớ trong một thư viện được chia sẻ sẽ được tải xuống một bản nhị phân phát hành. Tôi có nghĩa là thư viện được chia sẻ tôi xây dựng với tùy chọn -g nhưng nhị phân tải các thư viện được chia sẻ không được xây dựng với tùy chọn -g.valgrind - Tìm rò rỉ bộ nhớ trong một thư viện được chia sẻ

Tôi nhận được báo cáo rò rỉ như sau.

==739== at 0x4A05809: malloc (vg_replace_malloc.c:149) 
==739== by 0x84781B1: ??? 
==739== by 0x87507F5: ??? 
==739== by 0x874CF47: ??? 
==739== by 0x874E657: ??? 
==739== by 0x874F7C2: ??? 
==739== by 0x8779C0C: ??? 

Vui lòng cho tôi biết cách nhận dấu vết ngăn xếp của rò rỉ từ thư viện được chia sẻ?

Trả lời

6

Giả sử rằng rò rỉ thực sự đến từ thư viện được chia sẻ của bạn thì tôi không nghĩ rằng vấn đề là thiếu gỡ lỗi trong tệp thực thi chính.

Nhiều khả năng sự cố của bạn là tệp thực thi đang dỡ bỏ thư viện được chia sẻ bằng cách gọi dlclose trước khi kết thúc. Điều đó có nghĩa là khi valgrind đến để kiểm tra rò rỉ, tất cả thông tin ký hiệu cho thư viện sẽ biến mất khi thư viện không còn được tải.

Nếu bạn có thể xây dựng lại tệp thực thi thì giải pháp dễ nhất có thể là tạm thời ngừng gọi số dlclose để thư viện vẫn được tải cho đến khi kết thúc.

Nếu bạn không thể làm điều đó, thì hãy thử sử dụng LD_PRELOAD để giữ thư viện nạp, như thế này:

LD_PRELOAD="/path/to/library.so" valgrind my-executable 

mà hy vọng sẽ đánh lừa các mối liên kết động vào giữ thư viện nạp ngay cả sau khi nó đã bị đóng cửa .

+0

Có một bản vá cung cấp tùy chọn vô hiệu hóa tải biểu tượng sau dlclose. Các miếng vá hoạt động và tôi đã sử dụng nó nhiều lần. Nhưng bản vá trên phiên bản cũ và tôi đoán nó đã bị hỏng rồi. https://bugs.kde.org/show_bug.cgi?id=79362 – k0n3ru

+0

@TomH: Hãy để tôi chỉ ra rằng giải pháp "bỏ qua dlclose" có thể dẫn đến nhiều kết quả dương tính giả. Nếu có các đối tượng trên ngăn xếp mà phá hủy các phần tử, mà là trên đống, sau đó chúng được hiển thị trong đầu ra như rò rỉ, bởi vì dlclose đã có thể thực hiện phá hủy ngay từ đầu. – newhouse

+0

Và thứ hai không hoạt động tốt, nếu valgrind là 64 bit, nhưng bạn gỡ lỗi 32 – newhouse

2

Như câu trả lời trước đây cho thấy, điều này là do bạn đã đóng thư viện của mình trước khi chương trình chấm dứt và do đó thông tin biểu tượng không có sẵn cho valgrind.

Sử dụng LD_PRELOAD không hoạt động đối với tôi; Bây giờ tôi có hai bản dựng; một trong đó rõ ràng không gọi dlclose(); về xây dựng này, valgrind báo cáo chính xác thông tin số dòng như bạn mong đợi với liên kết động.

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