Обновление: спасибо за ответы! Я сейчас на охоте за условиями гонки. Я обновлю, когда узнаю, в чем виновник, если это окажется чем-то интересным 🙂
Я вижу периодически возникающую ошибку в нашем приложении, которая, кажется, возникает только при включенной оптимизации компилятора. это приложение C ++ / CLI / C # в смешанном режиме, а VS2010 — это компилятор.
В качестве отправной точки, есть ли какие-то особые «плохие практики», которые мне следует искать в коде C ++?
Это не просто отладка против релиза, в обоих случаях это сборка релиза, единственное отличие состоит в том, что для флага оптимизации установлено значение Disabled или For Speed.
В качестве конкретного примера чего-то, в чем я не уверен — возвращение неконстантной ссылки на защищенное поле объекта. Может ли это отключить оптимизатор?
Оптимизация кода имеет тенденцию приводить к тому, что неопределенное поведение приводит вас к укусу. Например, чтение неинициализированных переменных с большей вероятностью вернет ненулевые значения. Внешняя запись может внезапно перезаписать что-то важное. Гонка данных может привести к другому эффекту, например, к изменению, которое никогда не будет видно, и т. Д. Поиск неопределенного поведения, включение всех предупреждений и их устранение, использование средства очистки кода и т. Д.
Некоторые причины, по которым вы можете увидеть проблемы:
Ваш код имеет неопределенное поведение, то есть не работает.
Ваш компилятор сломан.
Ваш код не работает, то есть имеет неопределенное поведение.
В debug-vs-release также есть такие вещи, как assert(e)
где оценка e
имеет важные побочные эффекты, и утверждение не скомпилировано в коде выпуска; но вы говорите, что у вас есть только код выпуска, поэтому я предполагаю, что это не так.
Убедитесь, что вы используете все доступные инструменты отладки, которые вы можете найти; статические анализаторы кода (например, предупреждения компилятора, убсан Кланга), отладчики динамической памяти (Valgrind, asan), средства проверки правильности потоков (Helgrind, tsan) и т. д.