Хочу поделиться одним неприятным открытием для себя. Век живи век учись, как говорится. Значит. Имеется большой проект. Порядка 115 000 строчек кода. Для знающих людей, зовется он Линкмастер. Этот проект был обновлен до новой версии и сильно оптимизированн. Повторяющиеся действия были вынесены в процедуры. Активно использовалась рекурсия. И вот новая версия … у некоторых тестеров не работает. И ни единой ошибки. Просто не возникает результата. Причины непонятны. Я уже начал думать, что это влияние магнитных волн на ноутбук сказывается. В дебагере идем по строчкам кода, вдруг в одной из подпрограмм возникает исключительная ситуация. Которая никак самим дебаггером не идентифицируется. Поток программы перепрыгивает весь алгоритм до строчки end и на этом все заканчивается. Никакого намека на ошибку. Никаких сообщений об ошибке. Самое странное, что если эту строчку, после которой поток «выходит», закомментировать, то все нормально. Если заменить на какую-то другую функцию – опять «выходит». Переписываешь подпрограмму другим образом – все равно «выходит». Ну настоящее колдунство.

А теперь причина в студию:
Не хватает размера стека. Стек – это область памяти, в которую заливаются регистры процессора, когда программа входит в подпрограмму (подпрограмма в подпрограмму). После того, как подпрограмма заканчивает работу – из стека возвращаются сохраненные регистры. Таким образом получается модель клубка с нитками – чем дальше в глубь программы идет исполнение тем больше в этот стек запихивается данных – клубок закручивается. А потом из глуби кода, программа выходит обратно на самые высокие процедуры и клубок обратно раскручивается. Если не хватает размера памяти выделенного под этот клубок – начинаются различного рода анамалии. Исправляется в настройках проекта
Project->Options->Max. stack size

Связанные статьи: