FuckOverflowException
20 May 2012 16:45![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Наконец начал класть последние мазки на своего монстра, хромающего сразу на все лапы. Ну, думаю сейчас половлю остатних блох, и... Как бы не так.
Вылез StackOverflowException. При входе в какой-то конструктор. Че делать? Ну, ладно завтра на работе на компе с большей памятью погоняю. Но сегодня-то что делать?
Вылез StackOverflowException. При входе в какой-то конструктор. Че делать? Ну, ладно завтра на работе на компе с большей памятью погоняю. Но сегодня-то что делать?
no subject
Date: 20 May 2012 18:06 (UTC)У тебя же есть stacktrace; ну там всё и видно.
no subject
Date: 20 May 2012 18:53 (UTC)А в стэктрейсе некоторые системные куски отладчик не прослеживает.
Моя гипотеза, что просто мало оперативной памяти. Дома всего 1Г. Некоторые другие домашние глюки на работе не проявляются.
no subject
Date: 23 May 2012 21:18 (UTC)Вылезает StackOverflowException. Пытаюсь локализовать плохую рекурсию, а не могу.
Очевидно, что проблема связана с одним новым классом, с его конструктором, но проследить не могу: стэк не показывает.
Запускаю пакет как под VS2008 так и под 2010.
В пошаговом режиме под отладчиком в 2008 ошибка вываливается в момент, когда я вызываю квадратный корень, на операции
х=sqrt(х); !
Без отладчика вываливается в другой момент, несколько позже. Причем в этом случае, подозрительный конструктор, сука, отрабатывает до конца по крайней мере один раз!
Под 2010 картина похожая, но вываливание немного в другие моменты.
Какие идеи, чтобы визуализовать ошибку моей логики?
no subject
Date: 26 May 2012 13:35 (UTC)no subject
Date: 26 May 2012 14:17 (UTC)Т.е. до входа все ок, когда же входим, то не исполняется 1-я же операция.
По моиму ощущению, дело в том, что здесь конфликт между философией компиляции и интерпретации. Отладчик - это пошаговая интерпретация. Построение пустого объекта - это просто (заранее, в компилируемом режиме!) просчитывание и выделение памяти под него. Когда ошибка именно здесь, то отладчик ВС мне не дает средств проследить ее в пошаговом режиме. Сам то он об нее спотыкается, но где-то у себя в кишках.
Вот если бы он построил объект, то дальше могу работать пошагово.
no subject
Date: 26 May 2012 15:03 (UTC)я бы вспомнила, какой код был добавлен после той версии, которая еще работала, и его отключила. А потом делила его пополам. А если не помнишь, то отключала бы очень крупные куски, сверху вниз.
И все это без пошаговой отладки, просто смотреть, грохнется ли, и если да - то в каком месте (последнее может ускорить локализацию вредоносного куска).
Правда, все это получается когда компиляция выполняется за приемлемое время.
no subject
Date: 26 May 2012 16:03 (UTC)А старой версии, ошибка вела себя как ртутный шарик: когда в отладчике работаешь, то вываливется не там, когда без него. Плюс к тому, по разному в 2008 и 2010. И как при этом делить пополам?
no subject
Date: 26 May 2012 17:23 (UTC)Тогда и надо начать с самого верха.
no subject
Date: 26 May 2012 19:06 (UTC)Однако, в эти часы наметился прогресс:
стало ясно, что конструктор валится, если я создаю объект класса внутри программного модуля, а если как глобальный, то он не валится.
Но дальше идут новые чудеса, в которых пока не могу разобратся:
Начинаю по существу инициализировать переменную Х
(подкласс_большого_класса Х; )
моего объекта-пустышки, вызываю конструктор:
Х=подкласс_большого_класса (параметры конструктора);
внутри этого конструктора все делается верно. Выхожу из конструктора - Х остался каким был, т.е. неопределенным.
вставляю в эту програмку вспомогательную переменную того же подкласса:
подкласс_большого_класса темп(параметры конструктора);
Х=темп;
Результат: темп правильный, Х остался как был.
no subject
Date: 27 May 2012 02:32 (UTC)У меня на компе 2 версии винда XP: 32 и 64х. В каждой своя версия VS 2008.
Предыдущие чудеса были на 32. Они исчезли без каких либо изменений в 64. Программа продвинулась значительно дальше. Проблем с новым конструктором никаких: прекрасно сработал. Никаких бяк из прошлого поста.
Но потом случилось новое чудо. Я в текущей версии объект нового класса и несколько старых засунул в один супер-класс. И работаю с глобалным объектом этого суперкласса, сделав старые функции его членами. Короче, нахожусь в функции А этого класса вызванной из глобалного объекта, выполняю функцию Б. 'this' из А виден и в прекрасном состоянии, вызываю функцию С того же класса. При входе - stack оверфло, и this перестает быть виден изнутри С.
При этом вызове не строится ничего, не работает ни один конструктор. Ни одной команды С не успевает выполнится.
no subject
Date: 27 May 2012 19:07 (UTC)Для любопытствующих (интересно, кто из богов отвечает на небесах за программирование?), засунул прект в его текущем состоянии на http://newton.uam.mx/xgeorge/bicub_v_2008.rar.
no subject
Date: 28 May 2012 01:11 (UTC)Родилась дикая идея: в этом подлом случае надо делить пополам не назад, а вперед.
Поделю-ка тот модуль, котором не сработала ни одна команда, и посмотрю что выйдет.
no subject
Date: 29 May 2012 02:13 (UTC)Наверно я никогда не узнаю почему.
Ведь замена
cloud_of_ms_cl_in_3x3 *p_var;
p_var = new cloud_of_ms_cl_in_3x3(iii, jjj);
AT.CLD=*p_var;
delete p_var;
//AT.CLD= cloud_of_ms_cl_in_3x3(iii, jjj);
комментированного кода на некоментированный в одной из подпрограммок, не объясняет ничего. Кода у меня больше 500Кб и я всегда писал как в комментированном коде. Ничего плохого в этом не было.
Это как если бы в детективе труп неожиданно бесследно сперли, а мы продолжаем искать убийцу.
no subject
Date: 26 May 2012 14:21 (UTC)