Якщо ви кодуєте в C, Objective-C або C ++, ви можете використовувати CLang Static Analyzer, щоб критикувати джерело, не використовуючи його.
Доступні деякі засоби налагодження пам’яті: ValGrind, Guard Malloc на Mac OS X, Electric Fence на * NIX.
Деякі середовища розробки надають можливість використовувати алокатор пам'яті налагодження, який виконує функції наповнення щойно виділених сторінок та знову звільнених сторінок сміттям, виявляє звільнення нерозподілених покажчиків та записує деякі дані до та після кожного блоку купи, при цьому налагоджувач буде називається, якщо відома закономірність цих даних колись змінюється.
Якийсь хлопець на Slashdot сказав, що він отримав велику цінність за однократну, коли-небудь нову лінію джерела в налагоджувачі. "Це все", - сказав він. Я не завжди дотримуюсь його порад, але коли я маю це, мені це було дуже корисно. Навіть якщо у вас немає тестового випадку, який стимулює незвичайний шлях коду, ви можете згорнути змінну у своєму відладчику, щоб пройти такі шляхи, скажімо, виділивши деяку кількість пам'яті, а потім за допомогою відладчика встановити новий вказівник на NULL замість адреса пам'яті, потім перебравшись через обробник несправності розподілу.
Використовуйте твердження - макрос assert () в C, C ++ та Objective-C. Якщо ваша мова не забезпечує функції затвердження, напишіть її самостійно.
Використовуйте заяви ствердно, а потім залишайте їх у своєму коді. Я називаю assert () "Тест, який продовжує тестувати". Я використовую їх найчастіше для перевірки передумов у точці входу більшості моїх функцій. Це одна частина "Програмування за контрактом", яка вбудована в мову програмування Ейфеля. Інша частина - це постумови, тобто використання assert () у точках повернення функції, але я вважаю, що я не отримую стільки пробігу, як попередні умови.
Ви також можете використовувати assrt для перевірки інваріантів класу. Хоча жодному класу категорично не потрібно мати будь-якого інваріанта, у більшості розумно розроблених класів вони є. Інваріант класу - це якась умова, яка завжди є інакшою, ніж всередині функцій членів, яка може тимчасово перевести ваш об'єкт у непослідовний стан. Такі функції завжди повинні відновити консистенцію, перш ніж вони повернуться.
Таким чином, кожна функція-член могла перевірити інваріант при вході та виході, а клас міг визначити функцію під назвою CheckInvariant, яку може викликати будь-який інший код у будь-який час.
Використовуйте інструмент покриття коду, щоб перевірити, які рядки вашого джерела насправді проходять тестування, а потім тести дизайну, які стимулюють неперевірені лінії. Наприклад, ви можете перевірити оброблювачі з низькою пам'яттю, запустивши додаток всередині VM, налаштованого мало фізичної пам’яті, або без файлу підкачки або дуже маленького.
(Чомусь я ніколи не був прихильним, хоча BeOS міг працювати без файлу swap, це було вкрай нестабільно. Домінік Гіампаоло, який написав файлову систему BFS, закликав мене ніколи не запускати BeOS без заміни. Я не дивіться, чому це має значення, але це, мабуть, був якийсь артефакт впровадження.)
Ви також повинні перевірити відповідь вашого коду на помилки вводу / виводу. Спробуйте зберегти всі свої файли в мережевій мережі, а потім від'єднайте мережевий кабель, коли ваша програма має велику завантаженість. Аналогічно від'єднайте кабель - або вимкніть бездротовий зв’язок - якщо ви спілкуєтесь по мережі.
Одне, що мені здається особливо вразливим, - це веб-сайти, які не мають надійного коду Javascript. Сторінки Facebook завантажують десятки маленьких файлів Javascript, але якщо якийсь із них не вдалося завантажити, вся сторінка ламається. Просто має бути якийсь спосіб забезпечити певну відмову, скажімо, повторним завантаженням, або забезпечити розумний відкат, коли деякі ваші сценарії не завантажувались.
Спробуйте вбити свій додаток за допомогою налагоджувача або з "kill -9" на * NIX, поки він прямо в середині запису великого важливого файлу. Якщо ваша програма добре архітектурована, весь файл буде написаний або взагалі не буде записаний, або, можливо, якщо він буде написаний лише частково, те, що буде написано, не буде пошкоджено, а дані, що зберігаються, повністю використовуються додаток після повторного читання файлу.
у базах даних завжди є відмовно-відхилені дискові введення / виведення, але навряд чи це є будь-який інший додаток. Хоча файлові системи, що перебувають у перекладі, запобігають пошкодженню файлової системи у разі відключення електроенергії або збоїв, вони взагалі нічого не роблять для запобігання пошкодження або втрати даних кінцевого користувача. Це відповідальність за користувацькі програми, але навряд чи хтось, крім баз даних, реалізує відмовостійкість.