Явно инициализируйте DWORD значением 1, но отладчик показывает значение, выходящее за пределы допустимого диапазона

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

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

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

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

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


person Aaronontheweb    schedule 28.04.2014    source источник
comment
Информация о просмотре ненадежна в режиме деблокирования. Код по-прежнему выполняется правильно?   -  person dlf    schedule 28.04.2014
comment
@dlf это не так - у меня есть журнал диагностики, который записывает выходные данные в файловую систему, и значение dword довольно сильно различается в режиме выпуска.   -  person Aaronontheweb    schedule 28.04.2014
comment
Если вы зарегистрируете nResult в файле именно в том месте, которое вы указали, вы получите что-то отличное от 1? Это действительно было бы довольно удивительно.   -  person dlf    schedule 28.04.2014
comment
@dlf знаете что - только что понял, что вывод отладки, на который я смотрел, был из предыдущей сборки. Я сделал полную перестройку, и действительно, создается правильный вывод.   -  person Aaronontheweb    schedule 28.04.2014
comment
@JohnDibling исправил это сейчас - очевидно, была несвязанная ошибка, которая возникла только в режиме выпуска, из-за которой казалось, что это значение DWORD было виновником, поскольку этот DWORD отвечал за сохранение кода выхода для дочернего процесса. После добавления некоторого явного ведения журнала для самого DWORD я смог изолировать его от предыдущего тестового запуска, который не был очищен должным образом.   -  person Aaronontheweb    schedule 29.04.2014


Ответы (2)


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

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

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

person PaulMcKenzie    schedule 28.04.2014

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

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

person paulm    schedule 28.04.2014