Хочу поделиться одним неприятным открытием для себя. Век живи век учись, как говорится. Значит. Имеется большой проект. Порядка 115 000 строчек кода. Для знающих людей, зовется он Линкмастер. Этот проект был обновлен до новой версии и сильно оптимизированн. Повторяющиеся действия были вынесены в процедуры. Активно использовалась рекурсия. И вот новая версия … у некоторых тестеров не работает. И ни единой ошибки. Просто не возникает результата. Причины непонятны. Я уже начал думать, что это влияние магнитных волн на ноутбук сказывается. В дебагере идем по строчкам кода, вдруг в одной из подпрограмм возникает исключительная ситуация. Которая никак самим дебаггером не идентифицируется. Поток программы перепрыгивает весь алгоритм до строчки end и на этом все заканчивается. Никакого намека на ошибку. Никаких сообщений об ошибке. Самое странное, что если эту строчку, после которой поток «выходит», закомментировать, то все нормально. Если заменить на какую-то другую функцию – опять «выходит». Переписываешь подпрограмму другим образом – все равно «выходит». Ну настоящее колдунство.
А теперь причина в студию:
Не хватает размера стека. Стек – это область памяти, в которую заливаются регистры процессора, когда программа входит в подпрограмму (подпрограмма в подпрограмму). После того, как подпрограмма заканчивает работу – из стека возвращаются сохраненные регистры. Таким образом получается модель клубка с нитками – чем дальше в глубь программы идет исполнение тем больше в этот стек запихивается данных – клубок закручивается. А потом из глуби кода, программа выходит обратно на самые высокие процедуры и клубок обратно раскручивается. Если не хватает размера памяти выделенного под этот клубок – начинаются различного рода анамалии. Исправляется в настройках проекта
Project->Options->Max. stack size
Программа на Delphi вылетает по непонятным причинам
4 коментариев to “Программа на Delphi вылетает по непонятным причинам”
Отсавить коментарий
Рубрики
Облако тегов
Комментарии
-
- Вольф к записи Почему Delphi лучше C++
- Александр к записи Почему Delphi лучше C++
- Павел к записи Борьба с вирусами
- Дмитрий к записи Proxifier
- 1 к записи Борьба с вирусами
Blogroll
Календарь
Сентябрь 2010 Пн Вт Ср Чт Пт Сб Вс « Апр 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
динамические матрицы и массивы
всякие подпрограммы
tstud
блин ваще хз она не говорила
по ходам обьясни
А в настройках компилятора стоит галочка Overflow Checking?
Конечно. Не надо уповать на overflow checking. Проблема именно в большом количестве рекурсивных функций была. Ну и видно кое-где неэффективно параметры через стек передавались. Может следовало по указателю.