"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 вставок был шанс получить первый сбой. Дальше они распространялись по дереву очень быстро, т.к. лишние узлы добавляли переполненных, они практически гарантированно расщеплялись с добавлением еще лишних и т.д...
msvc9test.exe!Treestalk::RTree::hierarhicalDispose(Treestalk::RTreeNode * node=0x7c840c5b, bool disposeRecords=true) Строка 435 + 0x9 байт C++
ffffffff()
Это - самый ужасный стек вызовов, что я видел в жизни. Пришли из ниоткуда, выпали нигде.
Ладно, вру. Хуже было - когда он или пустой вообще или весь забит непонятно-чем. Но этот выглядит красиво

------------
Итак, бага побеждена. И нет, это не было порчей памяти или стека, все было гораздо проще. В одном из алгоритмов оказался вырожденный случай, который приводил к появлению в дереве дубликатов узлов. причем дубликаты распространялись по нему вплоть до перехода на разные уровни. поэтому рекурсивное удаление узлов и приводило к вылету. сегфолт, ребята. сегфолт.
Как нашел. Напечатал адреса всех узлов в дереве, добавил в set и list, проверил уникальность (маленький скрипт на питоне). Ее не оказалось. А дальше - все просто - реализация того же в C++ и прогон на каждом шаге цикла, который дерево и гробил. и 2 часа отладки чтобы дойти до места, где же все стало плохо. еще 2 часа, чтобы понять почему и полтора на исправление.
Интересно то, что ситуация воспроизводилась только на большом объеме данных (чтобы воспроизвелся вырожденный случай), но, более того, обязательное требование - узлы малых объемов (2-4 записи на несколько тысяч вставляемых). Таким образом, после ~1k вставок был шанс получить первый сбой. Дальше они распространялись по дереву очень быстро, т.к. лишние узлы добавляли переполненных, они практически гарантированно расщеплялись с добавлением еще лишних и т.д...