Явно инициализируйте DWORD в 1, но отладчик показывает дико вне диапазона значений

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

Вот скриншот того, что происходит внутри VS2013:

введите описание изображения здесь

Я инициализирую nResult до 1L, а внутреннее значение отображается как 3422785012. В режиме отладки это значение действительно равно 1L.

Любые идеи относительно того, почему отображаемое значение даже не близко к начальному значению, которое я установил для nResult? Я пытался играть с настройками компилятора — в режиме отладки этот код работает нормально.

4

Решение

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

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

Если вы хотите отладить сборку релиза, но видите правильные значения в отладчике, перейдите в Свойства вашего проекта в Visual Studio, перейдите в раздел C / C ++ и отключите оптимизацию. Перестроить.

13

Другие решения

Отладка кода релиза довольно сложна, так как компилятор переупорядочивает, удаляет, вставляет и переставляет вещи.

Единственный надежный способ отладки сборки «релиза» — оставить все опции релиза включенными, но отключить оптимизацию кода. Или вы можете просто отключить оптимизацию в любых модулях, от которых вы хотите получить полную информацию об отладке. Я видел это в прошлом, когда невозможно было отследить ошибку в полностью оптимизированной выпущенной сборке x64, так как x64 забивает параметры гораздо чаще, чем x86 (при просмотре аварийных дампов).

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector