Релиз / Отладка ада, с проектом V-studio C ++ - PullRequest
0 голосов
/ 02 июля 2010

Я так устал от этого. Я работаю в Visual Studio, используя C ++, и немного углубился в разработку, прежде чем пытаться выполнить цикл сборки / запуска релиза, только чтобы обнаружить сбои сборки релиза. Это не оставляет мне никакого способа решить проблему, кроме как взломать большие куски кода в поисках всех потенциальных нарушителей. В любом случае, если я войду в свойства своего проекта "release" и включу базу данных отладки для "Edit and Continue", а DON'T даже не включу Debugging в компоновщике, версия Release будет работать отлично.

Хорошо, я ценю любые отзывы о том, что нужно искать, чтобы правильно заставить работать мою версию Release, но я смею задать этот вопрос: «Кто заботится»? Я понимаю, что если компоновщик действительно связывается с версиями DEBUG исполняемых библиотек и библиотек Windows, то эта программа, вероятно, не будет работать ни в одной системе, в которой не установлен VStudio. Но как насчет того, что я делаю ... просто позволяя формату DEBUG компилятора установить «Программная база данных для редактирования и продолжения (/ ZI)». Вряд ли это имеет значение в 1 КБ в приложении, и если это не остановит работу EXE-файла, может быть, я должен просто оставить его таким? Или я прошу о неприятностях?

- Randy

Ответы [ 4 ]

1 голос
/ 02 июля 2010

"Какая разница?"... ну, вы должны.

Тот факт, что сборка релиза дает сбой, указывает, что с ним что-то не так.

Если включение символов отладки "исправляет" это, у вас есть магияисправить, что вы не понимаете.Почему это исправить?Можете ли вы полагаться на то, что это исправление работает на каждом ПК, на котором установлено ваше программное обеспечение?

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

Но вы не можете действительно полагаться на такое исправление.Это подрывает всякую уверенность в вашем приложении и укусит вас однажды (такое исправление может легко перестать "работать" при следующей компиляции приложения)

Вам нужно изолировать, чтоименно это вызывает эту проблему - если это случается более одного раза, то вы ничего не узнали за последний раз, когда исправили это.Это не нормально для приложения работать в режиме отладки, но не в выпуске, поэтому должно быть что-то, что вы делаете неправильно - вам нужно разобраться, что это такое, и исправить это, чтобы избежать таких ошибок в будущем.(Например, если это переполнение буфера, это может быть просто из-за того, что вы выделяете буфер из «n» элементов, а затем получаете доступ к элементу «n» - вы должны получить доступ только к элементам от 0 до (n-1). Это очень легко исправить один развы понимаете, как писать такой код ... но вам нужно приложить немного усилий, чтобы понять, что вы делаете неправильно)

0 голосов
/ 02 июля 2010

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

0 голосов
/ 02 июля 2010

Я использую одну сборку вместо отдельных сборок отладки и выпуска: см. " Отдельные сборки" debug "и" release "? "

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

  • Какая версия исполняемых библиотек?
  • Оптимизация компилятора?
  • Инкрементное связывание?
  • Редактировать и продолжить?
  • Символическая отладочная информация?

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

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

0 голосов
/ 02 июля 2010

Я думаю, вам нужно определить, какие у вас есть методы / код, которые вызывают сбой в Debug, но не в Release.

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

Кроме того, «Я работаю в Visual Studio с использованием C ++ и немного углубился в разработку, прежде чем пытаться запустить цикл сборки / запуска релиза», это указывает на то, что вы, возможно, захотите развить больше дисциплины в своей практике разработки.Возможно, вы захотите потратить немного времени на изучение некоторых методов разработки, основанных на тестировании;Я обнаружил, что это улучшило мой уровень ошибок кода / компиляции.

...