Какви грешки могат да доведат до срив на приложение, написано на C
Имате изходния код за приложение, което се срива след стартиране. След десет стартирания в програмата за отстраняване на грешки установявате, че програмата се срива на различно място всеки път. Приложението е еднонишково и използва само стандартната библиотека C. Какви грешки могат да доведат до срив на приложение? Как проверявате всеки един?
Въпросът до голяма степен зависи от вида на приложението, което се диагностицира. Все пак можем да дадем някои общи причини за случайни повреди.
- „Случайна“ променлива: Едно приложение може да използва някаква „случайна“ стойност или компонентна променлива, която няма конкретна точна стойност. Примери: въвеждане от потребителя, произволно число, генерирано от програмата, час от деня и др.
- Неинициализирана променлива: Едно приложение може да използва неинициализирана променлива, която в някои програмни езици по подразбиране може да приеме произволна стойност. По този начин кодът може да се изпълнява по различен начин всеки път.
- Изтичане на памет: Програмата може да е изчерпала всички ресурси. Други причини са случайни и зависят от броя процеси, изпълнявани в даден момент. Това може също да включва препълване на купчина или повреда на данните в стека.
- Външни причини: Програмата може да зависи от друго приложение, машина или ресурс. Ако има много такива връзки, програмата може да "падне" всеки момент.
За да намерите проблема, трябва да проучите приложението колкото е възможно повече. Кой го лансира? Какво правят потребителите? Какво прави самото приложение?
Въпреки че приложението не се срива на определено място, възможно е самият срив да е свързан с конкретни компоненти или сценарии. Например, дадено приложение може да остане функционално в момента на стартиране и да се провали само след товаизтегляне на файл. Или повредата възниква в зоната на отговорност на компоненти на ниско ниво, като файлов I/O.
Можете да направите произволно тестване. Затворете всички други приложения. Следете всички безплатни ресурси много внимателно. Ако е възможно да деактивирате части от програмата, направете го. Стартирайте програмата на друга машина и вижте дали се появява тази грешка. Колкото повече можем да променим, толкова по-лесно е да открием проблема.
Освен това можете да използвате специални инструменти за проверка на конкретни ситуации. Например, за да проучите причината за грешки от тип 2, можете да използвате дебъгери, които проверяват неинициализирани променливи. Такива задачи ви позволяват да демонстрирате не само умствени способности, но и стила на вашата работа. Постоянно ли скачате от един на друг и правите произволни предположения? Или подхождате логично към проблема? Бих искал да се надявам на последното.