Trình xác minh ứng dụng kết hợp với Công cụ gỡ lỗi cho Windows là một thiết lập tuyệt vời. Bạn có thể lấy cả hai như một phần của Bộ điều khiển Windows hoặc SDK Windows nhẹ hơn . (Tìm thấy hiểu về Application Verifier khi nghiên cứu một câu hỏi trước đó về một vấn đề đống tham nhũng .) Tôi đã sử dụng BoundsChecker và Đảm bảo ++ (đề cập trong câu trả lời khác) trong quá khứ cũng vậy, mặc dù tôi đã rất ngạc nhiên bao nhiêu chức năng là trong Application Verifier.
Hàng rào điện (còn gọi là "efence"), dmalloc , valgrind , v.v ... đều đáng được đề cập, nhưng hầu hết trong số này dễ dàng hơn để chạy dưới * nix so với Windows. Valgrind rất linh hoạt: Tôi đã gỡ lỗi phần mềm máy chủ lớn với nhiều vấn đề heap khi sử dụng nó.
Khi thất bại, bạn có thể cung cấp cho nhà điều hành toàn cầu mới / xóa và quá tải malloc / calloc / realloc - cách thực hiện sẽ thay đổi một chút tùy thuộc vào trình biên dịch và nền tảng - và đây sẽ là một khoản đầu tư - nhưng nó có thể trả hết trong thời gian dài. Danh sách tính năng mong muốn sẽ trông quen thuộc từ dmalloc và điện, và cuốn sách xuất sắc đáng ngạc nhiên Writing Solid Code :
- giá trị sentry : cho phép thêm một chút không gian trước và sau mỗi lần phân bổ, tôn trọng yêu cầu căn chỉnh tối đa; điền vào các số ma thuật (giúp bắt bộ đệm tràn và tràn, và con trỏ "hoang dã" thỉnh thoảng)
- alloc fill : điền vào các phân bổ mới với giá trị 0 khác - Visual C ++ sẽ thực hiện điều này cho bạn trong các bản dựng Debug (giúp bắt sử dụng các vars chưa được khởi tạo)
- điền miễn phí : điền vào bộ nhớ đã giải phóng với giá trị ma thuật bằng 0, được thiết kế để kích hoạt một segfault nếu nó bị hủy đăng ký trong hầu hết các trường hợp (giúp bắt con trỏ lơ lửng)
- bị trì hoãn miễn phí : không trả lại bộ nhớ đã giải phóng cho heap trong một thời gian, giữ cho nó được lấp đầy nhưng không có sẵn (giúp bắt được nhiều con trỏ lơ lửng hơn, bắt được hai lần tự do)
- theo dõi : có thể ghi lại nơi phân bổ được thực hiện đôi khi có thể hữu ích
Lưu ý rằng trong hệ thống homebrew cục bộ của chúng tôi (đối với mục tiêu được nhúng), chúng tôi giữ việc theo dõi tách biệt với hầu hết các nội dung khác, vì chi phí hoạt động trong thời gian chạy cao hơn nhiều.
Nếu bạn quan tâm đến nhiều lý do hơn để quá tải các hàm / toán tử phân bổ này, hãy xem câu trả lời của tôi về "Bất kỳ lý do nào để quá tải toán tử toàn cầu mới và xóa?" ; không biết xấu hổ tự quảng cáo sang một bên, nó liệt kê các kỹ thuật khác hữu ích trong việc theo dõi các lỗi tham nhũng heap, cũng như các công cụ áp dụng khác.
Bởi vì tôi tiếp tục tìm câu trả lời của riêng mình ở đây khi tìm kiếm các giá trị phân bổ / miễn phí / hàng rào mà MS sử dụng, đây là một câu trả lời khác bao gồm các giá trị điền vào Microsoft dbgheap .