|
FLT_INVALID_OPERATION (c0000090) при вызове double.IsNan(double.NaN) в WinXP
|
|||
---|---|---|---|
#18+
Ситуация: имеется нативное приложение, которое в определенный момент инстанциирует CLR-хост (через CorBindToRuntimeEx , версия CLR - 4.0.30319, build flawor - workstation, флаги запуска - STARTUP_CONCURRENT_GC и STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN). Далее создается отдельный домен, и в него загружается сборка с COM-visible классами и интерфейсами, посредством которых осуществляется взаимодействие управляемого и неуправляемого кода. Всё работает прекрасно, за одним небольшим исключением: на ОС старше висты (WinXP, windows server 2000) всё это просто молча падает. Сначала в консольном выводе было замечено, что Process is terminated due to StackOverflowException - но ни в неуправлемом, ни в управляемом коде нет ни рекурсии, ни чего-л., что могло бы привести к SOF. Попробовал описанное здесь: debugging - How to debug a stackoverflowexception in .NET - Stack Overflow - и ничего не нашел, но заметил, что в выводе WinDbg промелькнула ошибка c0000090. Дальнейшие исследования дали вот такую картину: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
(и так подряд 1032 строки) Код: plaintext 1. 2. 3. 4. 5. 6.
c0000090 - это FLT_INVALID_OPERATION, ошибка операции с плавающей точкой. И максимально сжатый дотнетовский код, приводящий к вышеописанному, выглядит вот так: Код: c# 1.
причем рвется именно на вызове double.IsNan. Если обернуть это в try/catch, то результат будет нулевой - всё те же 1032 c0000090, и SOF в итоге. Посмотрел в исходниках фреймворка, как реализован IsNan: Код: c# 1. 2. 3. 4.
- проще от этого не стало. Если всё то же самое делать в чистом дотнетовском приложении, то проблем никаких нет. Даже если сборку загружать в отдельном домене. Более того, если в папку с приложением положить конфиг NLog'а (библиотека использует NLog), то всё заработает нормально, причем конфиг может быть вообще пустым - т.е. длиной 0 байт. Видимо, NLog при попытке загрузки конфига, даже если он невалиден, что-то инициализирует/меняет так, что потом всё начинает работать нормально - но вот что? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2020, 10:19 |
|
FLT_INVALID_OPERATION (c0000090) при вызове double.IsNan(double.NaN) в WinXP
|
|||
---|---|---|---|
#18+
StackOverflow может быть и не связана с рекурсией, ошибка говорит лишь о том, что стек переполнен. Если объявить массив в стеке пару мегабайт, будет тоже самое, он же не резиновый. И его размером можно управлять. Вообще у меня была похожая ошибка, связана она была с тем, что я загружал одну версию сборки в память, а в каталоге C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\ был Image для сборки другой версии. Возможно вы загружаете сборку System.Xml.dll не из GAC, а ту, что притащили с собой. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2020, 10:59 |
|
FLT_INVALID_OPERATION (c0000090) при вызове double.IsNan(double.NaN) в WinXP
|
|||
---|---|---|---|
#18+
Roman Mejtes Возможно вы загружаете сборку System.Xml.dll не из GAC, а ту, что притащили с собой. Нет, здесь дело не в сборках. Вот, нашел в интернетах: https://aakinshin.net/ru/posts/delphi-fpu-issue/ Проверил - действительно, это проблема с регистрами FPU: delphi (нативное приложение написано на нем) переопределяет флаги регистров по-своему, и именно из-за этого ошибка вылетает при работе с double. Решение по ссылке проблему ликвидирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2020, 12:09 |
|
FLT_INVALID_OPERATION (c0000090) при вызове double.IsNan(double.NaN) в WinXP
|
|||
---|---|---|---|
#18+
Roman Mejtes Если объявить массив в стеке пару мегабайт Как, интересно? Массивы (их данные) живут в куче (временами даже в специальной куче). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2020, 13:32 |
|
|
start [/forum/topic.php?fid=20&fpage=9&tid=1398491]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 382ms |
0 / 0 |