2010-05-18 34 views
10

Các công cụ phát hiện rò rỉ bộ nhớ như làm sạch và valgrind hoạt động như thế nào?Công cụ phát hiện rò rỉ bộ nhớ

Tôi làm cách nào để thiết kế và triển khai công cụ như vậy?

+1

http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan

+1

Bạn có thể thử [heap debugger] của tôi [http://stackoverflow.com/questions/2835416/critique-my-non- intrusive-heap-debugger) để bắt đầu ;-) – fredoverflow

+0

Tôi sẽ không gắn cờ đó là trùng lặp, câu hỏi 'valgrind' có liên quan nhưng" cách triển khai của riêng tôi "là mới. –

Trả lời

5

Để phát hiện rò rỉ cơ bản, bạn chỉ cần móc vào các thói quen cấp phát bộ nhớ mức thấp, ví dụ: bằng cách vá malloc/miễn phí. Sau đó, bạn theo dõi tất cả phân bổ và sau đó báo cáo bất kỳ phân bổ nào chưa được giải phóng tại một điểm thích hợp, ví dụ: ngay trước khi thoát.

8

Các công cụ như vậy thường là cụ bằng mã số riêng của chúng. ví dụ, họ thay thế mọi cuộc gọi đến malloc()free() bằng các chức năng của riêng họ, cho phép họ thực hiện theo từng phân bổ.

Trong Visual Studio này có thể được thực hiện tự động chỉ sử dụng C Runtime Library sử dụng chức năng từ gia đình của _CrtDumpMemoryLeaks()

+2

Bạn có thể sử dụng các công cụ - deleaker (nếu bạn là người dùng Windows). – MastAvalons

+2

deleaker - công cụ tuyệt vời! Bộ nhớ Supoort và rò rỉ GDI, e.t. – z0r1fan

3

Đối với công việc thực tế, valgrind hoạt động khá tốt. Nó phát hiện rò rỉ đọc/ghi và bộ nhớ không hợp lệ.

Đối với dự án sở thích, bạn có thể tạo mô-đun quản lý bộ nhớ của riêng bạn theo dõi phân bổ con trỏ khác nhau và cách sử dụng nó. Nếu bạn không thấy một số vị trí mem được sử dụng trong thời gian dài, nó có thể bị rò rỉ.

1

Tôi đang phát triển công cụ này: Deleaker.

Chắc chắn, ý tưởng rõ ràng là móc tất cả các chức năng phân bổ và deallocations. Đó không chỉ là malloc và miễn phí, thay vì HeapAlloc/HeapFree (nếu chúng ta đang nói về nền tảng Windows) bởi vì các phiên bản VC++ hiện đại (sau VC 6.0) chỉ chuyển hướng malloc/miễn phí thành winpacki của HeapAlloc/HeapFree.

Đối với mỗi phân bổ, một ngăn xếp được lưu và một đối tượng được lưu. Trên mỗi deallocation đối tượng được giải phóng. Thoạt nhìn, nó đơn giản như vậy: chỉ cần lưu trữ một danh sách các đối tượng được phân bổ và loại bỏ một đối tượng trên hook deallocation.

Nhưng có những phần khó khăn:

  • Speed ​​

Bạn cần phải duy trì một danh sách các đối tượng được phân bổ. Nếu bạn thêm/xóa một đối tượng trong mỗi hàm được nối, quá trình này đang được thực hiện để tạm dừng. Điều đó có vẻ là một vấn đề phổ biến của các công cụ như vậy.

  • Stack Trace

Sử dụng dbghelp.dll chức năng để có được stack trace mất rất nhiều thời gian. Bạn phải nhận các mục nhập stack nhanh hơn: ví dụ bằng cách đọc thủ công bộ nhớ quá trình.

  • Sai tích cực

Một số rò rỉ được sản xuất bởi DLL hệ thống. Nếu bạn hiển thị tất cả chúng, bạn có một tấn rò rỉ, nhưng người dùng không thể "giải quyết" nó: người đó không có quyền truy cập vào mã nguồn của nó và không thể ngăn chặn việc thực thi mã này.Không thể dừng rò rỉ này. Một số trong số đó là phân bổ đơn tại điểm vào của hệ thống dll, do đó, nó không phải là một rò rỉ thực sự (một câu hỏi hay, sự rò rỉ là gì?). Làm thế nào để nhận ra những rò rỉ đó phải được hiển thị? Một bộ lọc tốt là một câu trả lời.

Hy vọng điều này sẽ hữu ích.

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