22:56

"But only in their dreams can man be truly free. 'Twas always thus, and always thus will be."
feeefeee()
msvc9test.exe!Treestalk::RTree::hierarhicalDispose(Treestalk::RTreeNode * node=0x7c840c5b, bool disposeRecords=true) Строка 435 + 0x9 байт C++
ffffffff()

Это - самый ужасный стек вызовов, что я видел в жизни. Пришли из ниоткуда, выпали нигде.

Ладно, вру. Хуже было - когда он или пустой вообще или весь забит непонятно-чем. Но этот выглядит красиво :)

------------

Итак, бага побеждена. И нет, это не было порчей памяти или стека, все было гораздо проще. В одном из алгоритмов оказался вырожденный случай, который приводил к появлению в дереве дубликатов узлов. причем дубликаты распространялись по нему вплоть до перехода на разные уровни. поэтому рекурсивное удаление узлов и приводило к вылету. сегфолт, ребята. сегфолт.

Как нашел. Напечатал адреса всех узлов в дереве, добавил в set и list, проверил уникальность (маленький скрипт на питоне). Ее не оказалось. А дальше - все просто - реализация того же в C++ и прогон на каждом шаге цикла, который дерево и гробил. и 2 часа отладки чтобы дойти до места, где же все стало плохо. еще 2 часа, чтобы понять почему и полтора на исправление.

Интересно то, что ситуация воспроизводилась только на большом объеме данных (чтобы воспроизвелся вырожденный случай), но, более того, обязательное требование - узлы малых объемов (2-4 записи на несколько тысяч вставляемых). Таким образом, после ~1k вставок был шанс получить первый сбой. Дальше они распространялись по дереву очень быстро, т.к. лишние узлы добавляли переполненных, они практически гарантированно расщеплялись с добавлением еще лишних и т.д...

Комментарии
17.01.2011 в 19:24

дрыхнущий
перезапилил адрес возврата и пошел гулять и добра наживать? =)
17.01.2011 в 23:26

"But only in their dreams can man be truly free. 'Twas always thus, and always thus will be."
не, ключик компилятора /O2 ;)

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail