У меня есть сервис с кодом, который работает годами.
Теперь, используя VS-2019 16.3.7 / 8/9, я получаю исключения 0xC000001D (Поток пытался выполнить недопустимую инструкцию.) Для первой арифметики с плавающей запятой в фазе загрузки службы в некоторыхмашины.
Установка той же базы кода, скомпилированной с 16.2.4 / 5, работает.
У меня полный дамп памяти с одного компьютера. Сбой происходит при вызове _dtol3
.
. Я вижу в коде сборки эту ситуацию.
0149477B 83 3D B4 AC 55 01 06 cmp dword ptr [__isa_available (0155ACB4h)],6
01494782 7C 15 jl _dtol3_default (01494799h)
01494784 C5 FA 7E C0 vmovq xmm0,xmm0
01494788 62 F1 FD 08 7A C0 vcvttpd2qq xmm0,xmm0 <---- CRASH
__isa_available
имеет значение 6. На моей машине это значение5. Одна машина, на которой мы видим сбой - это XEON Silver 4110
, на котором запущено наше программное обеспечение. Тот же exe работает на XEON E5-2620
. Тот же exe-файл работает на всех моих клиентских машинах в моей компании без каких-либо проблем (сочетание старых и новых машин Intel).
Глядя на вызываемый код, я вижу простое различие и деление на двойные значения, сравнивая его со значением, большим или равным 1,0.
COleDateTime nowClient = COleDateTime::GetCurrentTime(),
nowDB = GetCurrentTime();
COleDateTimeSpan diff = nowDB-nowClient;
if (diff.GetTotalMinutes()>=1) // <----- CRASH
...
Есть ли способвлиять на создание кода в VS, чтобы избежать обращения к этому коду? (Любая регулировка, настройка совместимости)
Есть ли какие-либо известные изменения в VS-2019, которые влияют на плавающую математику после VS 16.2.4, которые могут повлиять на мою проблему?