Через WinDbg удалось понять:
Исключение типа Stack overflow. Всё шло как надо, просто спирит не в состоянии обработать столько.
Крэш как бы намекает на то, что надо переходить с прототипа на спирите на нормальную реализацию.
Здравствуйте, Alexander G, Вы писали:
AG>Не знаю, сюда, в КУ или сразу в КСВ...
+1
Всё-таки в КУ наверное
А окошко внизу -- это call stack?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Alexander G, Вы писали:
AG>Не знаю, сюда, в КУ или сразу в КСВ...
Ты просто не умеешь их готовить
У меня есть специальный перловый транслятор, я через него всегда прогоняю все сообщения компилятора (это автоматически в мейк-файле), стеки от дебаггера и т.п. — выглядит все в результате вполне читабельно.
К тому же в большинстве случаев ошибка у тебя в коде, и библиотечные потроха тебе просто не нужны (поэтмоу в моем скрипте они скрываются, иначе через всякие "instantiated from" невозможно продраться, ну и grep -v никто не отменял.)
Здравствуйте, Alexander G, Вы писали:
AG>Через WinDbg удалось понять: AG>Исключение типа Stack overflow. Всё шло как надо, просто спирит не в состоянии обработать столько. AG>Крэш как бы намекает на то, что надо переходить с прототипа на спирите на нормальную реализацию.
А ты уверен, что это проблема спирита, а не кривой грамматики, которую ты на нем написал?
Включи отладочный режим (есть специальный макрос на эту тему), посмотри, как именно он парсит все, может, у тебя там просто бесконечная рекурсия (самая распространенная причина Stack overflow)?
Здравствуйте, jazzer, Вы писали:
J>Ты просто не умеешь их готовить J>У меня есть специальный перловый транслятор, я через него всегда прогоняю все сообщения компилятора (это автоматически в мейк-файле), стеки от дебаггера и т.п. — выглядит все в результате вполне читабельно.
Не было необходимости, это единичный случай. У меня нет большого количества "шаблонной магии" в коде, так что проблемы интерпретации диагностики нет. Насчёт сообщений компилятора при ошибках в STL, в bind — то к ним легко привыкнуть. Кстати, в критичном коде бинд вообще не использую.
Этот случай легко разобран WinDbg без хитроумных трансляторов.
Здравствуйте, Alexander G, Вы писали:
AG>Насчёт сообщений компилятора при ошибках в STL, в bind — то к ним легко привыкнуть.
Зачем привыкать, если можно читать по-человечески
AG>Кстати, в критичном коде бинд вообще не использую.
А какие проблемы с bind? Он же инлайнится весь (если ты его в function не сохраняешь, конечно же).
Здравствуйте, jazzer, Вы писали:
J>А ты уверен, что это проблема спирита, а не кривой грамматики, которую ты на нем написал? J>Включи отладочный режим (есть специальный макрос на эту тему), посмотри, как именно он парсит все, может, у тебя там просто бесконечная рекурсия (самая распространенная причина Stack overflow)?
Уверен.
Рекурсия в одном месте — такая:
group = '(' >> +element >> ')';
element = ...|group;
Здравствуйте, jazzer, Вы писали:
J>А какие проблемы с bind? Он же инлайнится весь (если ты его в function не сохраняешь, конечно же).
Не всегда весь. Ещё, делает несколько лишних копирований, можно упустить копирование чего-то большого.
Если бинд для передачи в for_each — всегда будет лучше BOOST_FOREACH, для более сложного алгоритма можно не полениться написать функтор.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, jazzer, Вы писали:
J>>А какие проблемы с bind? Он же инлайнится весь (если ты его в function не сохраняешь, конечно же).
AG>Не всегда весь. Ещё, делает несколько лишних копирований, можно упустить копирование чего-то большого.
boost::ref, boost::cref тебя спасет (ну да я уверен, что ты и без меня про них знаешь)
AG>Если бинд для передачи в for_each — всегда будет лучше BOOST_FOREACH, для более сложного алгоритма можно не полениться написать функтор.
BOOST_FOREACH не всеми компиляторами поддерживается, к сожалению
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Alexander G, Вы писали:
AG>>Здравствуйте, jazzer, Вы писали:
J>>>А какие проблемы с bind? Он же инлайнится весь (если ты его в function не сохраняешь, конечно же).
AG>>Не всегда весь. Ещё, делает несколько лишних копирований, можно упустить копирование чего-то большого. J>boost::ref, boost::cref тебя спасет (ну да я уверен, что ты и без меня про них знаешь)
Для this'а ещё спасёт &.
Для бинда, помещаемого в function и живущего дольше контекста shared_ptr спасёт.
Здравствуйте, Alexander G, Вы писали:
J>>Ну и файл, который нужно распарсить, естественно.
AG>
AG> memset(p, '(', size);
AG>
Ну да, рекурсия не бесконечная, всего 1024 * 1024 раз
Т.е. если вызов функции занимает всего байт на стеке (чего быть не может, так как надо хранить информацию для отката), то это сразу мегабайт
Я тебе такой крэш и без всякого спирита сэмулирую.
У тебя реально файлы такие? Т.е. все эти скобки еще миллион раз закроются же? Если не секрет, что ты за задачу решаешь, что тебе нужно парсить миллион раз вложенные скобки?
jazzer wrote:
> У тебя реально файлы такие? Т.е. все эти скобки еще миллион раз > закроются же? Если не секрет, что ты за задачу решаешь, что тебе нужно > парсить миллион раз вложенные скобки?
Хм... а это реально может быть проблемой, если есть возможность DoS-аттак. Нехорошо, если какой-нибудь сервис будет падать по переполнению стека при специально сформированных входных данных.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, jazzer, Вы писали:
J>У тебя реально файлы такие? Т.е. все эти скобки еще миллион раз закроются же? Если не секрет, что ты за задачу решаешь, что тебе нужно парсить миллион раз вложенные скобки?
Интерпретатор LISP?
Здравствуйте, jazzer, Вы писали:
J>У тебя реально файлы такие? Т.е. все эти скобки еще миллион раз закроются же? Если не секрет, что ты за задачу решаешь, что тебе нужно парсить миллион раз вложенные скобки?
Какой файл — не знаю, в дампе кучи нет, из стекового бектрейса извлекать сложно. Да, миллион скобок — это не реально, но и реальная грамматика сложнее. Я верю, что это не ошибка в моём коде, а патологический случай входных данных.
Кстати, boost::regex имеет макрос BOOST_REGEX_NON_RECURSIVE для тех, кто хочет обрабатывать любые входные данные без переполнения стека.