Двойная переменная назначена 0 при прохождении (F10) C ++ Код в отладке в Visual Studio 2022, xmm0 resgre ПроблемаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Двойная переменная назначена 0 при прохождении (F10) C ++ Код в отладке в Visual Studio 2022, xmm0 resgre Проблема

Сообщение Anonymous »

Я столкнулся с проблемой с назначением значений для удвоения переменных при переходе ( f10 ) мой код. Это произошло только тогда, когда я использовал шаг за шагом ( f10 ). Если я использовал run ( f5 ) с точками останова, назначение ведет себя правильно. Кроме того, при запуске кода (та же конфигурация отладки) без отладки поведение было правильным. < /P>
Я использую 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»