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

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

Сообщение Anonymous »

Я столкнулся с проблемой назначения значений двойным переменным при переходе (F10) моего кода. Это произошло только тогда, когда я использовал пошаговый (F10). Если я использовал запуск (F5) с точками останова, назначение ведет себя правильно. Также при запуске кода (та же конфигурация отладки) без отладки поведение было верным. Я упростил его до минимальной функции, где было только назначение постоянной плавающей запятой.
Я знаю, что эта функция ничего не делает, но это делает ее более заметным. Оптимизация отключена, поэтому код действительно выполняется. Я испытал то же поведение в сложных функциях. Это только для того, чтобы показать проблему.
Я не думаю, что ни в коем случае точка выполнения попадает в условие IF, но это происходит с F10. < /P>
Это функция < /strong> для иллюстрации: < /p>

Код: Выделить всё

int AktualizujEfektivnuSadzbuDebug()
{
double cerpana_suma = 7.7;

cerpana_suma = 12.3;

if (cerpana_suma 
На самом деле нет причин, по которой он должен войти в условие if. Их я использую f5, это не так. Но если я использую F10 из точки останова на assigmnent "cerpana_suma = 12,3", то 0 назначается в переменную. И кондиционирование проверяет его на 0 положительно. < /P>
Разборка линии выглядит так: < /p>
551A5E03  movsd       xmm0,mmword ptr [__real@402899999999999a (55E26F48h)]
551A5E0B  movsd       mmword ptr [cerpana_suma],xmm0
Значение по адресу 0x55e26f48 является правильным:

xmmpling overpling. Первая строка ассемблера выше установлена ​​на 0 вместо постоянной из памяти 0x55e26f48!

на самом деле. /> После выполнения второй строки ассемблера выше, переменная «cerpana_suma» при 0x020fc1c8 установлена ​​на 0, что на самом деле является следствием недопустимого выполнения первой строки. src = "https://i.sstatic.net/22icqxm6.png"/>
Поэтому выполнение кода, если положительно оценка условия (cerpana_suma
желаемое поведение при этом приведет к тому же результату, что и удар F5, и оба дают один и тот же результат, что и запуск кода в целом.
, что может быть неправильно, что поведет в поведении между F10. Есть ли у кого -нибудь решение, так что по сравнению с правильной работой с регистрацией XMM0? Есть ли у кого -нибудь обходной путь? Уровень информации отладки установлен на максимум. Я пытался с вариантом динамической отладки и без него. Объявление переменной как летучая, не помогает. < /P>
Полные экраны отладки (память, реестр, разборка)



edit, Commently, потому что оригинальные комментарии. /> Я знаю, что оптимизация оставляет большую часть функции в этой форме. Я отключил оптимизацию. И исходная проблема была в гораздо более сложной функции. В полной форме не могла бы оптимизация не исключить функцию. Я постепенно удалял линии из функции, так что неверное поведение осталось. И в итоге я получил это. Оказалось, что описанное поведение одинаково, когда назначается значение из памяти и при назначении постоянной плавания. Оба случая разделяют использование регистра XMM0 в двух отдельных командах ASM. < /P>
и, как я уже сказал, поведение отличается, когда я использую F5 или запускаю программу в целом, и когда я использую F10. Кажется, что регистры не сохраняются из VS и используются для некоторых неявных вычислений из Vs. Это вычисление разрушает значение регистров SSE.
, и кажется, что использование F5 выполняет блок команд ASM (в данном случае 2 перемещения) в качестве одного блока. Без дополнительной оценки между ними. И F10 выполняет те же команды, что и последовательность отдельных команд. И появляется использование регистров SSE между двумя частями перемещения константы через регистры XMM0, что удаляет значение в середине. И я не знаю, почему это сделано VS. < /P>
Edit2: У меня есть еще один очень похожий проект, но скомпилирован как 64-битный. И это ведет себя правильно в очень похожей ситуации. Между этими двумя проектами могут быть и другие различия, но на данный момент 32-битный против 64-битный представляется наиболее значимым. На этом этапе у меня нет доказательств того, что это ключевая причина неправильного поведения.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ug-in-visu
Ответить

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

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

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

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

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