Странное поведение с переменными в сборках Release против Debug - PullRequest
0 голосов
/ 21 октября 2011

У меня есть проект C ++ в Visual Studio 2010.

Я просто пытаюсь сравнить две строки друг с другом, но я вижу дико различное поведение в моей сборке Release Сборка Debug работает как положено. Я не вносил никаких изменений в оптимизации, кроме значений по умолчанию, которые устанавливает Visual Studio 2010.

Вот мой код:

wchar_t validCRC[] = L"0xd07153b9";
wchar_t thisCRC[] = L"0xd07153b9"; // this is calculated on the fly but I get same behavior if I set it manually. i also tried setting these both to L"hello" and got same result

int cmp = 0;
cmp = wcscmp(validCRC, thisCRC); // if I put a breakpoint here, the visual studio debugger says 'cmp' is not in scope. 
pLog->Write("value of cmp: %d", cmp); // in both DEBUG and RELEASE, this prints "value of cmp: 0"

if (cmp == 0)
{ // yet for some reason, the DEBUG build follows this path
    return true;
}
else
{ // the RELEASE build follows this path
    return false;
}

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

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

Именно поэтому вы используете debug build для отладки и release build для сборки, которую вы будете release .

Если вам действительно нужно отладить проблему, возникающую только в сборке релиза (здесь часто встречаются неинициализированные переменные), вы можете использовать специфичную для компилятора #pragma, чтобы де-оптимизировать только определенные части, или вы можете де -оптимизировать определенные файлы, или вы можете использовать инструкции printf.

РЕДАКТИРОВАТЬ: Когда вы говорите «следовать» по этому пути, вы, вероятно, имеете в виду, что это то, как он выглядит, когда вы проходите через него в отладчике. Опять же, код оптимизирован, поэтому сборка не соответствует исходному коду. В частности, возвраты часто оптимизируются, так что в сборке есть только одна фактическая инструкция возврата. Таким образом, пошаговое выполнение кода в сборке релиза не является надежным способом определения происходящего.

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

0 голосов
/ 21 октября 2011

Попробуйте напечатать значение, а не полагаться на отладчик в режиме Release. Оптимизатор очень агрессивен, и ваши символы могут указывать на код, который оптимизируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...