2009-04-30 4 views
0

Я работаю над приложением/графическим интерфейсом, созданным с помощью Win32/ATL. Итак, есть поле UI (текстовое поле), которое отлично работает в соответствии с конструкцией отладки. С выпуском сборки он получает неверную форму, и похоже, что ширина текстового поля бесконечна. Он отлично работает в сборке отладки, но создает проблемы в выпуске сборки. Так что мой вопрос, как же код может работать в отладочной сборке и не работает в сборке релизов. Есть ли вероятность, что он может быть отправлен в настройки оптимизации в выпусках? В сборке релизов у ​​нас есть настройки оптимизации, установленные на минимальный размер, предпочтительный небольшой код. Также, когда я пытаюсь отлаживать выпуск, он снова отлично работает. Удаляет ли отладка в сборке релизов оптимизацию?Параметры оптимизации в VS

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

+0

Хорошо, что я включил/RTC в отладочной сборке. Но моя отладочная сборка работает нормально. В соответствии с моим пониманием/параметр RTC должен сделать неинициализированные переменные 0xCC, чтобы программа могла сбой или показать странные результаты. – anand

+0

Есть ли другой способ, которым я могу заставить свою отладочную сборку вести себя, как ее поведение в релизе? Или есть способ отладить мою версию релиза, чтобы исправить эту проблему. – anand

ответ

2

VC++ заполняет свою рабочую память в режиме отладки специальными значениями. Однако он не гарантирует фиксированную или нулевую инициализацию. Прочтите этот поток SO для деталей. Uninitialized Memory Blocks. Эти значения не могут каждый раз прерывать приложение.

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

Как указывали другие, определенная проблема с кодом; скорее всего, неинициализированные переменные.

0

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

0

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

+0

Инициализировать значение значению означает? Как и у меня есть одна переменная int i; Так что в отладочной сборке я получу инициализацию до 0? Есть ли способ перезаписать эту настройку? – anand

1

Попробуйте включить флаг компилятора /RTC (Run-Time Error Checks с опцией s. Это инициализирует локальные переменные для ненулевого значения, которое помогает диагностировать неинициализированные переменные.