Исключение арифметического переполнения или переполнения во время отладки

StackOverflow https://stackoverflow.com/questions/56655

Вопрос

Это день странного поведения.

У нас есть проект Win32, созданный с использованием Delphi 2007, в котором размещена среда выполнения .NET и который вызывает .NET для отображения новых форм в рамках переходного периода.

Недавно мы начали сталкиваться с исключениями в, казалось бы, случайных местах и ​​точках нашего кода:Арифметическое переполнение или опустошение.

Трассировка стека одного из них выглядит следующим образом:

at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at Gatsoft.Gat.UI.Windows.Forms.Remanaging.RemanageForm.DelphiOpenInNewMode(String employeeCode, String departmentCode, DateTime date) in C:\Dev\VS.NET\Gatsoft\Gatsoft.Gat.UI.Windows\Forms\Remanaging\RemanageForm.Delphi.cs:line 67

В решении Visual Studio одна из самых передовых библиотек классов (т.извлекает все возможные ссылки), установил специальную программу отладки, предназначенную для вывода проекта Delphi.Это позволяет нам отлаживать код .NET из Visual Studio, хотя основная часть программы написана на Delphi.

Проблема возникает только при запуске из отладчика, а не в том случае, если мы просто запускаем exe-файл напрямую (через проводник, ярлыки или даже Ctrl+F5 внутри Visual Studio).

Судя по всему, на машине нет шпионского ПО (на что намекает этот).

Что еще мы можем проверить?


Редактировать: Похоже, что отладчик .NET включает эти флаги SNAN, а отладчик Delphi — нет.Нам придется разобраться в этом подробнее, но сейчас я соглашусь. @Лоренцо Боккаччаответ.

Видимо решено

Хорошо, похоже, мы наконец-то решили эту проблему.Проблема начала возникать без подключения отладчика для наших тестировщиков, поэтому нам пришлось расставить приоритеты проблемы на более высокий уровень.

Наконец, мы обнаружили одну общую проблему с компьютерами, на которых возникла проблема: это ноутбуки Dell Lattitude D620 с NVIDIA Quadro NVS 110M и старым драйвером из образа системы, который использовался для инициализации ноутбуков еще в 2006 году.

Я нашел одно сообщение в Интернете, хотя потерял URL-адрес при перезагрузке, чтобы обновить драйвер дисплея, из-за которого произошел сбой службы .NET, в основном, когда машина была занята чем-то на экране.Одним из способов воспроизвести его проблему было открыть командную строку C:\ и выполнить DIR /S просто принудительно выполнить огромное количество обновлений экрана, что приведет к сбою.

У него тоже была видеокарта NVIDIA.

Проблема на моей машине возникала примерно через каждые 2-4 запуска нашей программы, но после обновления видеодрайвера у меня было 123 успешных запуска без каких-либо проблем.(Кстати, я могу порекомендовать AutoHotKey для таких вещей).

Похоже, мы нашли виновника — старый/глючный драйвер NVIDIA.

Обновил этот вопрос, чтобы, возможно, кто-то в будущем мог сэкономить время.

А теперь, если вы меня извините, я пойду плакать в угол.

Сглазили!

Должно быть, я сглазил.Не успел я выложить вышеуказанное обновление, как у коллеги вышел из строя ноутбук после обновления видеодрайвера.

Тем не менее, я уверен, что сейчас эта проблема находится за пределами нашего приложения, поэтому осталось выяснить, какие именно вещи нужно обновить.


Дальнейшие обновления:Хорошо, моя машина теперь, очевидно, исправлена, в отличие от машины моего коллеги.На данный момент мы обновили BIOS, драйверы набора микросхем, и в настоящее время выходит SP3 для XP.

Сегодня вечером будет проведено тестирование, во время которого приложение останется запускаться на ночь, поскольку проблема возникла либо во время запуска, либо при первом выполнении некоторого кода WinForms .NET.Это приложение в основном представляет собой приложение Delphi Win32, но в нем размещена среда выполнения .NET, и проблема, похоже, связана с кодом .NET.Проблема может возникнуть, когда мы «загружаем» среду выполнения .NET, или когда мы запускаем первое окно .NET из Win32, она также может появиться.


По статистике, я готов опубликовать этот код прямо сейчас.За ночь приложение запускалось 3051 раз без ошибок, тогда как до того, как я обновил видеодрайвер, оно вылетало раз в 2-4.

Пощупал и нашел(!/?)

Это испытание по исправлению ошибок похоже на поход к врачу, где завязывается следующий разговор:

Doc: Does this hurt?
Me: No...
Doc: What about now?

Я ковырял и ковырял приложение и, наконец, думаю, что нашел что-то, что мы сделали, что привело к этой проблеме.

В нашем приложении мы размещаем среду выполнения .NET из приложения Delphi 2007 Win32, а в нашем связующем коде у нас есть следующая строка (сейчас):

  rc := CorBindToRuntimeEx('v2.0.50727', 'wks',
  STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN or STARTUP_CONCURRENT_GC,
  @clsid, @iid, UnkRuntimeEngine);

Две константы посередине изначально были просто 0, что означает выберите значения по умолчанию.Это изменение было введено несколько месяцев назад, и с тех пор проблема постепенно нарастала.Это изменение было внесено для того, чтобы побудить профилировщик ANTS загружать наше приложение Win32 + размещенную среду выполнения .NET для выполнения профилирования производительности, и изменения, которые мы внесли тогда, сделали эту работу.Кроме того, проблема с арифметическим переполнением/недополнением постепенно ухудшалась, поэтому я готов поспорить, что проблема не появлялась какое-то время после изменения, поэтому она не была связана ни с одним из внесенных нами изменений.

Кроме того, поскольку мы (изначально) увидели проблему только при запуске через отладчик, мы подумали, что что-то не так с Visual Studio и/или Delphi.

В любом случае, по статистике теперь, когда браузер на одном экране выполняет повторяющуюся прокрутку вверх и вниз, вызванную javascript (очевидно, необходимый для запуска ошибки), я смог успешно запустить приложение 726 раз с 0 в вызове. , и он дает сбой в 5 из 17 раз с двумя константами.

Doc: Does this hurt?

И давайте не будем вдаваться в подробности, кто внес это изменение.Я уверен, что виновник хочет остаться анонимным... кашель

Это было полезно?

Решение

отладочная версия связанной dll может быть скомпилирована с поддержкой сигнализации nan, см. http://blogs.msdn.com/oldnewthing/archive/2008/07/02/8679191.aspx для примера этой проблемы.

что ошибка heisenbug была вызвана неинициализированными переменными, здесь может быть связанная dll, включающая функцию snan процессора и забывающая отключить ее при возвращении

Другие советы

Возникают ли ошибки, если подключить отладчик после запуска приложения?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top