2010-05-27 3 views
1

У меня есть код в Visual Studio 2008 на C++, который работает с файлами только с помощью fopen и fclose. Все работает отлично в режиме отладки. и я проверил несколько наборов данных. Но он не работает в режиме деблокирования. Он постоянно падает. Я выключил все оптимизации, также там нет зависимости ни к чему (в линкере), а также я поставил эти:Мой код работает в режиме отладки, но не в режиме деблокирования

Оптимизации: Disabled (/ Od) Keep данные без ссылок. Не удалять избыточные Оптимизация для Windows98: NO

Я все еще не понимаю, как это не должно работать в этих условиях. Что еще я должен отключить, чтобы он работал как в режиме отладки?

Я думаю, что если он работает в режиме деблокирования, но не в режиме отладки, это может быть ошибка кодирования, но, наоборот, выглядит странно. не так ли?

Я ценю любую помощь. --Nima

ответ

3

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

+0

Я проверял дважды, я не вижу таких ошибок. :) – Nima

+0

Еще одна вещь, которую нужно проверить - это возможность того, что буферы, которые вы используете для fread(), достаточно велики. Переполнение буфера может быть допущено в одной конфигурации сборки, но не просто из-за того, как вещи упорядочиваются в памяти и несколько отличаются от использования кучи в debug vs. release. –

+0

Ваш ответ выглядит перспективным, но я не смог найти точное местонахождение проблемы. Попытка отладки в режиме выпуска не помогает, так как она перескакивает некоторые части кода и внезапно падает. И я пробовал строительные леса (накладывая укусы ...), и здесь это происходит: Obj * f (...) { Obj * obj = new Obj (..); ... cout << "1" << endl; return obj; } void main() { Obj * obj = f (...); cout << "2" << endl; } он печатает 1, но не 2! – Nima

1

1) Дважды проверьте код и все, что зависит от макросов препроцессора.
2) Используйте assert() для проверки предустановок состояния программы. Нельзя ожидать, что это повлияет на поток программы (т. Е. Удаление проверки все равно позволит коду обеспечить тот же конечный результат), поскольку assert является макросом. Используйте регулярные условные выражения времени выполнения, когда assert не будет делать.
3) Действительно, никогда не оставляйте переменную в неинициализированном состоянии.

+0

1. Нет. 2. Я не использую assert(). – Nima

+0

1) :) 2) Начиная с утверждения с самого начала, это помогло бы вам уловить эту проблему очень рано. :) – Geoff

0

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

0

Я испытал это, и в моем случае это было из-за одного из моего массива структуры, который предположил бы иметь только индекс X, но мой цикл, который проверяет эту структуру, переходил на индекс X + 1. Интересно, что режим отладки работает нормально, хотя я был на Visual C++ 2005.

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

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