Общие причины ошибок в версии выпуска, не существующей в режиме отладки

Я думаю с помощью некоторого метода как aku's или , Guy является способом пойти, но несколько вещей отнять у определенных примеров:

  1. основная предпосылка должна была бы показать Ваш всплеск на отдельном потоке как можно скорее. Это - способ, которым я склонился бы, подобный тому, какой проиллюстрированный aku's, так как это - способ, с которым я являюсь самым знакомым. Я не знал о функции VB, которую упомянул Guy. И, даже думал, что это библиотека VB, он прав - это - весь IL в конце. Так, даже если это чувствует себя грязным , это не все настолько плохо!:) Я думаю, что Вы захотите быть уверенными, что или VB обеспечивает отдельный поток для в том переопределении или что Вы создаете тот сами - определенно исследование это.

  2. Принятие Вы создаете другой поток для отображения этого всплеска, Вы захотите остерегаться перекрестного потока обновления UI. Я поднимаю это, потому что Вы упомянули, что обновили прогресс. В основном, для сейфа необходимо вызвать функцию обновления (что Вы создаете) на форме всплеска с помощью делегата. Вы передаете того делегата в эти , Вызывают функция на объект формы Вашего экрана-заставки. На самом деле при вызове формы всплеска непосредственно для обновления элементов прогресса/UI на нем, Вы обеспечите исключение, Вы работаете на.Net 2.0 CLR. Как показывает опыт, любой элемент UI на форме должен быть обновлен потоком, который создал его - это что Форма. Вызовите обеспечивает.

Наконец, я, вероятно, решил бы создать всплеск (не используя перегрузку VB) в основном методе Вашего кода. Мне это лучше, чем наличие основной формы выполняет создание объекта и быть так плотно связанным с ним. Если бы Вы проявляете тот подход, я предложил бы создать простой интерфейс, который экран-заставка реализует - что-то как IStartupProgressListener - который получает обновления прогресса запуска через функцию членства. Это позволит Вам легко подкачивать в / любом классе по мере необходимости, и приятно разъединяет код. Форма всплеска может также знать, когда закрыть себя, если Вы уведомляете, когда запуск завершен.

65
задан 5 revs, 2 users 67% 19 November 2009 в 12:17
поделиться

14 ответов

Много раз в режиме отладки в C ++ все переменные инициализируются нулем, тогда как то же самое не происходит в режиме выпуска, если явно не указано иное.

Проверьте любые макросы отладки и неинициализированные переменные

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

Также проверьте все исключения, например, не имеет прямого отношения к режиму выпуска, но иногда мы просто игнорируем некоторые критические исключения, такие как нарушение доступа к памяти в VC ++, но то же самое может быть проблемой, по крайней мере, в других ОС, таких как Linux, Solaris. В идеале ваша программа не должна перехватывать такие критические исключения, как доступ к NULL-указателю.

31
ответ дан 24 November 2019 в 15:30
поделиться

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

0
ответ дан 24 November 2019 в 15:30
поделиться

Существуют оптимизации компилятора, которые могут нарушить допустимый код , потому что они слишком агрессивны.

Попробуйте скомпилировать код с включенной меньшей оптимизацией.

1
ответ дан 24 November 2019 в 15:30
поделиться

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

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

В отладочной версии ошибка может не возникать (поскольку время или распределение памяти другое), но это не означает, что ошибки нет. Также могут быть другие факторы, не связанные с режимом отладки, который изменяет время выполнения кода, вызывая возникновение ошибки или нет, но все сводится к тому, что если бы код был правильным, ошибка не возникла бы. в любой из ситуаций.

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

1
ответ дан 24 November 2019 в 15:30
поделиться

Не вдаваясь в подробности, я предполагаю, что «не в порядке» означает, что он либо не компилируется, либо выдает какую-то ошибку во время выполнения. Проверьте, есть ли у вас код, основанный на версии компиляции, с помощью операторов #if DEBUG или методов, отмеченных атрибутом Conditional .

1
ответ дан 24 November 2019 в 15:30
поделиться

Конечно, например, если вы используете конструкции типа

#if DEBUG

//some code

#endif
2
ответ дан 24 November 2019 в 15:30
поделиться

Может, особенно если вы находитесь в сфере C.

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

Другой причиной может быть оптимизация (которая обычно включена для релизных версий и отключена для отладки). Код и макет данных могли быть оптимизированы, и хотя ваша программа отладки просто, например, обращалась к неиспользуемой памяти, версия выпуска теперь пытается получить доступ к зарезервированной памяти или даже указывает на код!

РЕДАКТИРОВАТЬ: Я вижу, что другие упоминали это : конечно, у вас могут быть целые участки кода, которые условно исключаются, если не компилируются в режиме DEBUG. Если это так,

3
ответ дан 24 November 2019 в 15:30
поделиться

Да !, если у вас есть условная компиляция, могут быть ошибки синхронизации (оптимизированный код выпуска, неоптимизированный код отладки), повторное использование памяти или куча отладки.

3
ответ дан 24 November 2019 в 15:30
поделиться

Вам нужно предоставить намного больше информации, но да, это возможно. Это зависит от того, что делает ваша отладочная версия. У вас вполне могут быть журналы или дополнительные проверки, которые не скомпилированы в версию выпуска. Эти пути кода только для отладки могут иметь непредвиденные побочные эффекты, которые изменяют состояние или влияют на переменные странным образом. Сборки отладки обычно выполняются медленнее, поэтому это может повлиять на многопоточность и скрыть условия гонки. То же самое и с прямой оптимизацией из релизной компиляции, возможно (хотя и маловероятно в наши дни), что релизная компиляция может что-то закоротить как оптимизацию.

1
ответ дан 24 November 2019 в 15:30
поделиться

Другие различия могут быть такими:

  • В языке со сборкой мусора коллекционер обычно более агрессивен в режиме выпуска;
  • Разметка памяти может часто бывает разным;
  • Память может быть инициализированы иначе (например, может быть обнулен в режиме отладки или повторно использован агрессивно в выпуске);
  • Местные жители могут быть продвинутым для регистрации значений в выпуске, что может вызвать проблемы с плавающей запятой значения.
9
ответ дан 24 November 2019 в 15:30
поделиться

Распространенная ошибка - использование выражения с побочным эффектом внутри ASSERT.

19
ответ дан 24 November 2019 в 15:30
поделиться

В .NET, даже если вы не используете условную компиляцию, например #if DEBUG , компилятор по-прежнему гораздо более либерален в отношении оптимизаций в режиме выпуска, чем в режим отладки, который также может приводить только к выпуску ошибок.

2
ответ дан 24 November 2019 в 15:30
поделиться

Функции библиотеки CRT ведут себя по-разному при отладке и выпуске (/ MD vs /MDd).

Например, отладочные версии часто предварительно заполняют буферы, которые вы передаете до указанной длины, чтобы проверить свое утверждение. Примеры включают strcpy_s , StringCchCopy и т. Д. Даже если строки заканчиваются раньше, ваш szDest лучше будет иметь длину n байтов!

3
ответ дан 24 November 2019 в 15:30
поделиться

В прошлом меня укусили ошибки, которые исправлялись в отладочных сборках, но давали сбой в сборках Release. Существует множество основных причин (включая, конечно, те, которые уже были описаны в этой цепочке), и меня уловили все из следующего:

  • Переменные-члены или функции-члены в #ifdef _DEBUG , чтобы класс имел другой размер в отладочной сборке. Иногда #ifndef NDEBUG используется в сборке выпуска
  • Точно так же существует другой #ifdef , который присутствует только в одной из двух сборок
  • Отладочная версия использует отладочные версии системных библиотек, особенно функции распределения кучи и памяти
  • Встроенные функции в сборку выпуска
  • Порядок включения файлов заголовков. Это не должно вызывать проблем, но если у вас есть что-то вроде #pragma pack , которое не было сброшено, это может привести к неприятным проблемам.Подобные проблемы также могут возникать при использовании предварительно скомпилированных заголовков и принудительного включения
  • . Кеши: у вас может быть код, такой как кеши, которые используются только в сборках выпуска, или ограничения размера кеша, которые отличаются.
  • Конфигурации проекта: конфигурации отладки и выпуска могут иметь разные настройки сборки (это может произойти при использовании IDE)
  • Условия гонки, проблемы с синхронизацией и разные побочные эффекты, возникающие в результате кода только для отладки

Некоторые советы, которые я накопил за годы добраться до сути ошибок отладки / выпуска:

  • Попробуйте воспроизвести аномальное поведение в отладочной сборке, если можете, а еще лучше, напишите модульный тест, чтобы зафиксировать его
  • Подумайте, чем они отличаются: настройки компилятора , кеши, код только для отладки. Попытайтесь временно минимизировать эти различия
  • Создайте сборку выпуска с отключенной оптимизацией (чтобы у вас больше шансов получить полезные данные в отладчике) или оптимизированную сборку отладки. Минимизируя изменения между отладкой и выпуском, вы с большей вероятностью сможете определить, какая разница вызывает ошибку.
7
ответ дан 24 November 2019 в 15:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: