Cách theo dõi / khắc phục sự cố liên quan đến bộ nhớ trong mã C / C ++ lớn trên các hệ thống * nix


9

Chiến lược nào bạn sử dụng trong khi theo dõi một vấn đề liên quan đến bộ nhớ? Bạn sử dụng công cụ nào (nguồn mở cũng như độc quyền) để xác định rò rỉ bộ nhớ, hỏng bộ nhớ, v.v.? Làm thế nào bạn có thể theo dõi rò rỉ bộ nhớ nếu chỉ có gdb / dbx có sẵn trên một hệ thống?

Đối với tôi, sửa lỗi rò rỉ bộ nhớ chỉ với trình gỡ lỗi là rất khó.


2
Cá nhân tôi nghĩ rằng câu hỏi này liên quan đến lập trình nhiều hơn là liên quan đến unix.
phunehehe

Câu trả lời:


12

Nếu bạn có thể thay đổi mã nguồn, Dmalloc là tuyệt vời; nó sẽ liệt kê các con trỏ không tham gia và (đối với mã được xây dựng với các ký hiệu gỡ lỗi) chính xác chúng được phân bổ trên dòng nào.

Nếu bạn không thể, Valgrind gần như là tiêu chuẩn cho loại điều đó. Tôi thường thấy Valgrind hơi khó sử dụng hơn, nhưng nó có nhiều tính năng hơn và không liên quan đến việc thêm các cuộc gọi dmalloc vào mã của bạn


dmalloc không hoạt động tốt như mong đợi trong các hệ thống rất lớn. valgrind là đặt cược tốt hơn, và thậm chí có bạn sẽ nhấn nút thắt cổ chai ...

valgrind --tool memcheck "yourapp" sẽ cung cấp thông tin liên quan đến bộ nhớ trong thời gian chạy (hữu ích trong các hệ thống máy tính để bàn). Một công cụ tuyệt vời khác là memwatch nhưng nó nên được biên dịch cùng với nguồn của bạn. Memwatch có thể ghi nhật ký chi tiết vào một tệp do đó phù hợp hơn với các hệ thống nhúng.
rajaganesh87


2

Massif (từ valgrind) là một trong những cách tốt nhất để tìm rò rỉ bộ nhớ. Lặp lại mã đáng ngờ của bạn (hoặc chạy chương trình của bạn đủ lâu) và kết quả kết quả với ms_print. Thông thường, ngăn xếp cuộc gọi sẽ cung cấp cho bạn đủ thông tin để sửa nó.

Với GDB, bạn có thể thử đính kèm vào một chương trình đang chạy và gọi các chức năng như malloc_stats()

Nếu chương trình của bạn được viết bằng một ngôn ngữ khác, nó có thể khó hơn. Gần đây, một số GDB đã đạt được kịch bản và mọi người bắt đầu các dự án thú vị như gdb-heap , có thể phân tích bộ nhớ Python từ kết xuất lõi. Các kịch bản phân tích bộ nhớ tương tự có thể có thể cho các đối tượng C ++.

Đọc thêm /programming/2564752/examining-cc-heap-memory-statistic-in-gdb


1

Đối với Solaris, có một số công cụ được liệt kê trong câu trả lời cho câu hỏi StackOverflow này (chúng bao gồm kiểm tra rò rỉ với các hình thức truy cập bộ nhớ xấu khác).


1

Tôi đã làm Objective-C được một thời gian và có một máy phân tích xử lý việc quản lý bộ nhớ mức C và những thứ tương tự. Clang tĩnh phân tích tốt đến mức Apple quyết định đóng gói nó với xCode IDE của họ. Tôi không chắc điều này có tốt cho câu hỏi của bạn không, nhưng nếu bạn đang làm C thì nó đáng để thử.


Phân minh nhỏ: clang được phát triển để sử dụng trong xcode ngay từ đầu. Xem clang.llvm.org/clang_video-05-25-2007.html
Daniel James

Xin chào Daniel, điều đó có thể đúng, nhưng nó không được bao gồm trong xCode cho đến gần đây (hoặc ít nhất là không có trong gói tôi đã tải xuống từ Apple)
phunehehe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.