2011-03-18 7 views
3

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

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 одинаковы, сбрасывая их в файл после того, как цикл показывает, что те же данные были записаны. Перемещение цикла вверх и вниз вокруг этого фрагмента кода не помогает; также не меняет auto на List :: const_iterator.

Любые идеи, с которых начать отладку?

[Обновить] Отключение оптимизаций этой функции не устраняет ее для выпуска, но я могу приложить отладчик и увидеть, что все работает там, как ожидалось. Но я не получаю правильное поведение программы. Stills работает с «Run without Debugging» и «Run with Debug».

+0

Если начать он без отладки и прикрепления отладчика позже появляется ошибка? –

+0

Да, похоже. Интересно, посмотрим, поможет ли это. – Anteru

+0

Это не обязательно имеет отношение к этому коду - это может быть еще что-то переписывающее память, используемая этим кодом. Самая большая разница в cmd vs VS - это окружение, путь и командная строка args - проверьте эти –

ответ

4

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

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

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

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

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

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

+0

Уведомление Я получаю правильное поведение при запуске _without_ отладки от VS. – Anteru

+0

@ Аnteru: ничего странного, как только я наткнулся на ту же проблему (хорошо с отладочной кучей, авария на «нормальной» куче). Это зависит от того, какой шаблон (0xBAADF00D/0xCD/0x00) с большей вероятностью приведет к сбою кода. –

+0

Так что, даже если я бегу без отладки из VS, я получу кучу отладки? – Anteru

0

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

+0

Использование desc.units.at (index ++) не вызывает исключения, так что все в порядке. Он заполняется надлежащим количеством в другом месте. – Anteru

Смежные вопросы