2008-09-10 33 views
30

Trình phát hiện rò rỉ bộ nhớ nào mà mọi người có trải nghiệm tốt?Máy dò rò rỉ bộ nhớ cho C?

Dưới đây là một bản tóm tắt các câu trả lời cho đến nay:

Valgrind - khuôn khổ Instrumentation cho việc xây dựng các công cụ phân tích năng động.

Electric Fence - Một công cụ làm việc với GDB

Splint - Chú-Assisted Lightweight tĩnh Kiểm tra

Glow Code - Đây là một hoàn chỉnh thời gian thực hiệu suất và bộ nhớ profiler cho các lập trình Windows và .NET người phát triển ứng dụng với C++, C# hoặc bất kỳ .NET Framework nào

Ngoài ra, hãy xem điều này stackoverflow post.

Trả lời

11

Valgrind trong linux khá tốt; Tôi không có kinh nghiệm trong Windows với điều này.

1

Tôi đã có tình yêu tối thiểu đối với bất kỳ bộ phát hiện rò rỉ bộ nhớ nào. Thông thường có quá nhiều sai tích cực cho họ được sử dụng bất kỳ. Tôi muốn giới thiệu hai như beiong sự xâm nhập tối thiểu:

GlowCode

Debug heap

2

lint (công cụ mã nguồn mở rất tương tự gọi là splint)

+1

Đặc biệt nẹp không quá nhiều về rò rỉ. – 0xC0000022L

2

Đau đớn nhưng nếu bạn phải sử dụng một ..
Tôi muốn giới thiệu bộ DevPartner BoundsChecker .. đó là những gì mọi người tại nơi làm việc của tôi sử dụng cho mục đích này. N trả tiền độc quyền .. không phải phần mềm miễn phí.

+0

Tôi đã sử dụng BoundsChecker. Nó được * vô cùng * hữu ích, cả cho rò rỉ bộ nhớ và các loại rò rỉ tài nguyên khác. – Herms

0

Ở trường đại học khi tôi đang làm hầu hết mọi thứ trong Unix Solaris, tôi đã sử dụng gdb.

Tuy nhiên tôi sẽ đi với valgrind trong Linux.

-1

Tôi sẽ xếp thứ hai valgrind làm công cụ bên ngoài cho rò rỉ bộ nhớ.
Nhưng, đối với hầu hết các vấn đề tôi phải giải quyết, tôi luôn sử dụng các công cụ được xây dựng bên trong. Đôi khi các công cụ bên ngoài có quá nhiều chi phí hoặc quá phức tạp để thiết lập.

Tại sao sử dụng đã được viết mã khi bạn có thể viết riêng :)

Tôi đùa của bạn, nhưng đôi khi bạn cần một cái gì đó đơn giản và nó nhanh hơn để viết nó cho mình. Thông thường, tôi chỉ thay thế các cuộc gọi đến malloc() và miễn phí() với các chức năng theo dõi tốt hơn người phân bổ cái gì. Hầu hết các vấn đề của tôi dường như là một người nào đó quên miễn phí và điều này giúp giải quyết vấn đề đó.

Nó thực sự phụ thuộc vào nơi rò rỉ, và nếu bạn biết điều đó, thì bạn sẽ không cần bất kỳ công cụ nào. Nhưng nếu bạn có một số cái nhìn sâu sắc vào nơi bạn nghĩ rằng nó bị rò rỉ, sau đó đặt vào thiết bị của riêng bạn và xem nếu nó giúp bạn.

1

Đối với Win32 gỡ lỗi rò rỉ bộ nhớ tôi đã có kinh nghiệm rất tốt với đồng bằng cũ CRT gỡ lỗi Heap, mà đến như là một lib với Visual C.

Trong một Debug build malloc (et al) được định nghĩa lại như _malloc_dbg (et al) và có các cuộc gọi khác để truy xuất kết quả, tất cả đều không xác định nếu _DEBUG không được đặt. Nó thiết lập tất cả các loại bảo vệ biên giới trên heap, và cho phép bạn để ngoại giao các kết quả bất cứ lúc nào.

Tôi đã có một vài sai tích cực khi tôi đang đánh một số thói quen thời gian làm rối tung thời gian phân bổ thư viện chạy cho đến khi tôi phát hiện ra _CRT_BLOCK.

Tôi đã phải tạo ra DOS đầu tiên, sau đó là giao diện điều khiển và dịch vụ Win32 sẽ chạy bao giờ hết. Theo như tôi biết không có rò rỉ bộ nhớ, và trong ít nhất một nơi mã chạy trong hai năm không giám sát trước khi màn hình trên máy tính không thành công (mặc dù PC đã được sử dụng tốt!).

0

Cha ông của những công cụ này là thương mại, đóng nguồn Purify công cụ, được bán cho IBM và sau đó đến UNICOM

parasoft của Insure++ (mã nguồn thiết bị đo đạc) và valgrind (mã nguồn mở) là hai khác thực đối thủ cạnh tranh.

Câu đố: tác giả gốc của Purify, Reed Hastings, tiếp tục tìm thấy NetFlix.

3

Nếu bạn có tiền: IBM Rational Purify là bộ phát hiện lỗi bộ nhớ và bộ nhớ tham nhũng bộ nhớ cực kỳ mạnh mẽ cho C/C++. Tồn tại cho Windows, Solaris và Linux. Nếu bạn chỉ có Linux và muốn có một giải pháp rẻ tiền, hãy đi tìm Valgrind.

+1

Làm sạch mà Valgrind không làm gì? Thời gian qua tôi đã thử Purify, đó là một nỗi đau thực sự để thiết lập và nhận được bất cứ điều gì ra khỏi nó, cộng với bạn đã phải biên dịch bằng cách sử dụng trình biên dịch của họ. Valgrind sử dụng bản dựng gỡ lỗi bình thường của bạn. – florin

+0

Lưu ý rằng việc thanh lọc đã được bán cho UNICOM Systems http://unicomsi.com/products/purifyplus/ – djsadinoff

3

Mudflap cho gcc! Nó thực sự biên dịch các kiểm tra vào thực thi. Chỉ cần thêm

-fmudflap -lmudflap 

vào cờ gcc của bạn.

+0

Đối với người dùng trong tương lai, điều này không còn là trường hợp. Các cờ không làm gì theo liên kết. Thay vào đó hãy sử dụng Address Sanitizer. – UndyingJellyfish

1

Trên Windows, tôi đã sử dụng Visual Leak Detector. Tích hợp với VC++, dễ sử dụng (chỉ bao gồm một tiêu đề và thiết lập LIB để tìm lib), mã nguồn mở, miễn phí để sử dụng FTW.

2

Cũng đáng sử dụng nếu bạn sử dụng Linux bằng glibc là mã heap gỡ lỗi được tích hợp sẵn. Để sử dụng nó, liên kết với -lmcheck hoặc xác định (và xuất khẩu) các MALLOC_CHECK_ biến môi trường với giá trị 1, 2, hoặc 3. The glibc manual provides more information.

Chế độ này rất hữu ích nhất cho việc phát hiện đúp giải phóng, và nó thường tìm thấy viết bên ngoài khu vực bộ nhớ được cấp phát khi thực hiện miễn phí. Tôi không nghĩ rằng nó báo cáo bộ nhớ bị rò rỉ.

-1

Công cụ CheckPointer của chúng tôi có thể làm điều này cho GNU C 3/4 và, MS phương ngữ của C, và GreenHills C. Nó có thể tìm thấy vấn đề quản lý bộ nhớ mà Valgrind không thể.

Nếu mã của bạn chỉ đơn giản là rò rỉ, khi thoát CheckPointer sẽ cho bạn biết nơi tất cả bộ nhớ không xác định được cấp phát.

2

Tôi có khá nhiều lần truy cập với cppcheck, chỉ phân tích tĩnh. Nó là mã nguồn mở và có giao diện dòng lệnh (tôi không sử dụng nó theo bất kỳ cách nào khác).

+0

+1 cho cppcheck - không được sử dụng mà sẽ có một cái nhìn; khuyến nghị quan trọng là phân tích tĩnh – Andrew

0

Không ai đề cập đến clang's MSan, điều này khá mạnh mẽ. Tuy nhiên, nó chỉ được hỗ trợ chính thức trên Linux.

0

Câu hỏi này có thể cũ, nhưng tôi sẽ trả lời dù sao - có lẽ câu trả lời của tôi sẽ giúp ai đó tìm thấy rò rỉ bộ nhớ của họ.

này được dự án của riêng tôi - Tôi đã đặt nó mã nguồn mở như:

https://sourceforge.net/projects/diagnostic/

Windows 32 & nền tảng 64-bit được hỗ trợ, tự nhiên và hỗn hợp callstacks chế độ được hỗ trợ.

Thu gom rác .NET không được hỗ trợ. (C++ cli của gcnew hoặc mới của C#)

Công cụ hiệu suất cao và không yêu cầu tích hợp (trừ khi bạn thực sự muốn tích hợp nó).

Toàn bộ thủ công có thể được tìm thấy ở đây:

http://diagnostic.sourceforge.net/index.html

Đừng sợ bao nhiêu nó thực sự phát hiện rò rỉ nó quá trình của bạn. Nó bắt rò rỉ bộ nhớ từ toàn bộ quá trình. Phân tích chỉ rò rỉ lớn nhất, không phải tất cả.