Я использую 64-разрядную версию Visual Studio 2022 Professional 17.14.16.
Это впервые произошло в более сложной функции. Я упростил ее до минимальной функции, в которой было только присвоение константы с плавающей запятой. Я знаю, что эта функция ничего не делает, но это делает ее более заметной. Оптимизация отключена, поэтому код действительно выполняется. Я испытал такое же поведение в сложных функциях. Это только для демонстрации проблемы.
Я думаю, что точка выполнения ни в коем случае не должна попасть внутрь условия if, но это происходит с F10.
Это упрощенная функция для иллюстрации:
Код: Выделить всё
int AktualizujEfektivnuSadzbuDebug()
{
double cerpana_suma = 7.7;
cerpana_suma = 12.3;
if (cerpana_suma
Следовательно, выполнение кода положительно оценивает условие (cerpana_suma
The breakpoints after execution with variable at 0x020FC1C8 set to 9a 99 99 99 99 99 28 40:
Желаемое поведение будет в том, что удары f10 дает тот же результат, что и нажимать f5 , и оба могут дать тот же результат, что и код. Студия ведет себя по -разному между f10 и f5 во время отладки? У кого -нибудь есть решение, чтобы Visual Studio работала правильно с регистрацией xmm0 ? У кого -нибудь есть обходной путь для этого? Уровень информации отладки установлен на максимум. Я пытался с вариантом динамической отладки и без него. Объявление переменной как изменчивая не помогает.
Полные экраны отладки (память, реестр, разборка):
/> edit < /strong>: < /p>
Комментарий, потому что исходные комментарии не позволяют такому длинному тексту: < /p>
Я знаю, что оптимизация оставляет большую часть функции в этой форме. Я отключил оптимизацию. И исходная проблема была в гораздо более сложной функции. В полной форме оптимизация не могла пропустить функцию. Я постепенно удалял линии из функции, так что неверное поведение осталось. И в итоге я получил это. Оказалось, что описанное поведение одинаково, когда значение из памяти назначается и когда назначается постоянная точки с плавающей точкой. Оба случая разделяют использование xmm0 регистрации в двух отдельных командах сборки. Кажется, что регистры не сохраняются Visual Studio и используются для некоторых неявных вычислений из Visual Studio. Это вычисление разрушает значение регистров SSE. И f10 выполняет те же команды, что и последовательность отдельных команд, и приходит использование регистров SSE между двумя частями перемещения постоянной через регистр xmm0 , что удаляет значение в середине. И я не знаю, почему это сделано таким образом Visual Studio. < /P>
Редактировать 2: < /strong> < /p>
У меня есть еще один очень похожий проект, но составлен как 64-битный. И это ведет себя правильно в очень похожей ситуации. Между этими двумя проектами могут быть и другие различия, но на данный момент 32-битный против 64-битной, кажется, наиболее значимым. На этом этапе у меня нет доказательств того, что это ключевая причина неверного поведения.
Подробнее здесь: [url]https://stackoverflow.com/questions/79783476/double-variable-is-assigned-0-when-stepping-over-f10-c-code-in-debug-in-visu[/url]
Мобильная версия