Различное поведение, запущенное из командной строки в «Запуск без отладки» - PullRequest
3 голосов
/ 18 марта 2011

Почесывая голову здесь: у меня есть приложение, которое прекрасно работает в Debug + Release, если оно запущено из Visual Studio 2010, как в режиме отладки, так и в режиме «Выполнить без отладки». Если я запускаю одно и то же приложение из командной строки с одинаковыми настройками, я вижу другое поведение. В частности, код, который работает по-другому:

const List& vl = nDesc.Get<List> ("slots");

int index = 0;
for (auto it = vl.begin (), end = vl.end (); it != end; ++it)
{
    desc.units [index++] = Parse (Tree (*it));
    // If I access it again here, e.g.
    // Log::Info (std::distance (vl.begin (), it))
    // this works always
}

Я бы предположил, что это условие гонки, но код полностью однопоточный. Интересно, что добавление некоторого случайного кода не делает его работоспособным (то есть недостаточно просто зарегистрировать строку). О, и этот цикл запускается только один раз, когда-либо.

Данные в desc такие же, выгрузка их в файл после того, как цикл показывает, что те же данные были записаны. Перемещение цикла вверх и вниз в этом фрагменте кода не помогает; Также нельзя изменить авто на справку List :: const_iterator.

Есть идеи, с чего начать отладку?

[Update] Отключение оптимизаций для этой функции не исправляет ее для Release, но я могу прикрепить отладчик и увидеть, что все там работает, как ожидалось. Тем не менее, я не понимаю правильное поведение программы. Stills работает также с «Запустить без отладки» и «Запустить с отладкой».

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

Я подозреваю, что проблема связана с неинициализированным блоком динамической памяти.

Основное различие между его запуском без отладки и подключением к отладчику и его запуском из отладчика состоит в том, что во втором случаеИспользуется куча отладки Windows.

Куча отладки Windows предварительно заполняет память, передаваемую клиентам по определенному шаблону (0xBAADF00D IIRC), и активируется всякий раз, когда исполняемый файл запускается с подключенным отладчиком.Даже если это сделано для того, чтобы упростить обнаружение ошибок неинициализированной памяти (поскольку оно заполняет память «странным» шаблоном), в этом случае, вероятно, это маскирует вашу проблему, поскольку это становится очевидным только тогда, когда не используются кучи отладки (поэтому неинициализированнаяблоки памяти, вероятно, заполнены нулями).

Обратите внимание, что этот конкретный кодовый блок может быть лишь верхушкой айсберга, проблема может возникать в другом месте и возникать именно здесь.

Удачи в поиске ошибки, такая же проблема возникла и у меня со сторонней библиотекой, и, несмотря на несколько дней поиска, мне пришлось отказаться.

(Кстати, куча отладки Windowsне связан с кучей отладки CRT, которая активируется только в сборках отладки исполняемого файла, и, IIRC, заполняет память шаблоном 0xCD)

0 голосов
/ 18 марта 2011

Похоже, desc.units не хватает места для всех элементов, добавляемых в него, хотя нам нужно больше контекста, чтобы быть уверенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...