Я использую Visual Studio 2022 Professional 64-Bit 17.14.16. < /P>
Это сначала произошло в более сложной функции. Я упростил его до минимальной функции, когда было только назначение постоянной плавающей точки. Я знаю, что эта функция ничего не делает, но это делает ее более заметным. Оптимизация отключена, поэтому код действительно выполняется. Я испытал то же поведение в сложных функциях. Это только для того, чтобы показать проблему.
Я не думаю, что ни в каком случае точка выполнения не попадает в условие 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]
Мобильная версия