Nếu bạn viết mã bằng C, Objective-C hoặc C ++, bạn có thể sử dụng Trình phân tích tĩnh CLang để phê bình nguồn của mình mà không thực sự chạy nó.
Có một số công cụ gỡ lỗi bộ nhớ có sẵn: ValGrind, Guard Malloc trên Mac OS X, Hàng rào điện trên * NIX.
Một số môi trường phát triển cung cấp tùy chọn sử dụng bộ cấp phát bộ nhớ gỡ lỗi, những thứ như lấp đầy các trang mới được phân bổ và các trang mới được giải phóng với rác, phát hiện giải phóng các con trỏ chưa được phân bổ và viết một số dữ liệu trước và sau mỗi khối heap, với trình gỡ lỗi được gọi nếu mẫu đã biết của dữ liệu đó thay đổi.
Một số anh chàng trên Slashdot nói rằng anh ta nhận được rất nhiều giá trị từ một bước nguồn mới trong một trình gỡ lỗi. "Đó là nó", ông nói. Tôi không luôn làm theo lời khuyên của anh ấy, nhưng khi tôi có nó thì nó rất hữu ích với tôi. Ngay cả khi bạn không có trường hợp thử nghiệm kích thích đường dẫn mã không phổ biến, bạn có thể xoay vòng một biến trong trình gỡ lỗi của mình để thực hiện các đường dẫn đó, bằng cách phân bổ một số bộ nhớ, sau đó sử dụng trình gỡ lỗi để đặt con trỏ mới của bạn thành NULL thay vì địa chỉ bộ nhớ, sau đó bước qua xử lý thất bại phân bổ.
Sử dụng các xác nhận - macro khẳng định () trong C, C ++ và Objective-C. Nếu ngôn ngữ của bạn không cung cấp chức năng khẳng định, hãy tự viết.
Sử dụng các xác nhận một cách tự do, sau đó để chúng trong mã của bạn. Tôi gọi khẳng định () "Bài kiểm tra tiếp tục kiểm tra". Tôi sử dụng chúng phổ biến nhất để kiểm tra các điều kiện tiên quyết tại điểm vào của hầu hết các chức năng của tôi. Đó là một phần của "Lập trình theo hợp đồng", được tích hợp vào ngôn ngữ lập trình Eiffel. Phần khác là postconditions, nghĩa là sử dụng assert () tại các điểm trả về hàm, nhưng tôi thấy rằng tôi không nhận được nhiều dặm như điều kiện tiên quyết.
Bạn cũng có thể sử dụng assert để kiểm tra các bất biến lớp. Mặc dù không có lớp nào được yêu cầu nghiêm ngặt để có bất kỳ sự bất biến nào, nhưng hầu hết các lớp được thiết kế hợp lý đều có chúng. Một bất biến lớp là một số điều kiện luôn luôn đúng ngoài các hàm thành viên có thể tạm thời đặt đối tượng của bạn vào trạng thái không nhất quán. Các chức năng như vậy luôn phải khôi phục tính nhất quán trước khi chúng trở lại.
Do đó, mọi hàm thành viên có thể kiểm tra bất biến khi vào và ra và lớp có thể định nghĩa một hàm có tên là CheckInvariant mà bất kỳ mã nào khác có thể gọi bất cứ lúc nào.
Sử dụng một công cụ bao phủ mã để kiểm tra các dòng nào trong nguồn của bạn đang thực sự được kiểm tra, sau đó thiết kế các kiểm tra kích thích các dòng chưa được kiểm tra. Ví dụ: bạn có thể kiểm tra các trình xử lý bộ nhớ thấp bằng cách chạy ứng dụng của mình bên trong máy ảo được cấu hình với ít bộ nhớ vật lý và không có tệp hoán đổi hoặc một tệp rất nhỏ.
(Vì một số lý do mà tôi chưa bao giờ biết, trong khi BeOS có thể chạy mà không cần tệp hoán đổi, thì nó rất không ổn định theo cách đó. Dominic Giampaolo, người đã viết hệ thống tập tin BFS, đã thúc giục tôi đừng bao giờ chạy BeOS mà không trao đổi. xem tại sao điều đó lại quan trọng, nhưng nó phải là một loại tạo tác thực hiện.)
Bạn cũng nên kiểm tra phản hồi của mã đối với các lỗi I / O. Hãy thử lưu trữ tất cả các tệp của bạn trên một chia sẻ mạng, sau đó ngắt kết nối cáp mạng của bạn trong khi ứng dụng của bạn có khối lượng công việc lớn. Tương tự ngắt kết nối cáp - hoặc tắt mạng không dây của bạn - nếu bạn đang liên lạc qua mạng.
Một điều mà tôi thấy đặc biệt khó chịu là các trang web không có mã Javascript mạnh mẽ. Các trang của Facebook tải hàng tá tệp Javascript nhỏ, nhưng nếu bất kỳ một trong số chúng không tải xuống được thì toàn bộ trang sẽ bị hỏng. Chỉ cần có một số cách để cung cấp khả năng chịu lỗi, bằng cách thử lại tải xuống hoặc cung cấp một số loại dự phòng hợp lý khi một số tập lệnh của bạn không tải xuống.
Hãy thử tắt ứng dụng của bạn bằng trình gỡ lỗi hoặc bằng "kill -9" trên * NIX trong khi nó ở ngay giữa khi viết một tệp lớn, quan trọng. Nếu ứng dụng của bạn được kiến trúc tốt, toàn bộ tệp sẽ được viết hoặc hoàn toàn không được viết hoặc có thể nếu nó chỉ được viết một phần, những gì được viết sẽ không bị hỏng, với những dữ liệu được lưu hoàn toàn có thể sử dụng được các ứng dụng khi đọc lại tập tin.
cơ sở dữ liệu luôn có I / O đĩa chịu lỗi, nhưng hầu như không có loại ứng dụng nào khác làm được. Mặc dù các hệ thống tệp được ghi nhật ký ngăn chặn tham nhũng hệ thống tệp trong trường hợp mất điện hoặc gặp sự cố, chúng không làm gì cả để ngăn chặn tham nhũng hoặc mất dữ liệu của người dùng cuối. Đó là trách nhiệm của các ứng dụng người dùng, nhưng hầu như không có cơ sở dữ liệu nào khác thực hiện khả năng chịu lỗi.