visual studio - studio - Excepción aritmética de desbordamiento o desbordamiento durante la depuración
visual studio code change all occurrences (2)
Este es el día de comportamiento extraño.
Tenemos un proyecto Win32 creado con Delphi 2007, que aloja .NET Runtime y llama a .NET para mostrar nuevos formularios, como parte de un período de transición.
Recientemente, hemos comenzado a experimentar excepciones en ubicaciones y puntos aparentemente aleatorios de nuestro código: Desbordamiento aritmético o subdesbordamiento.
La traza de la pila de uno de estos se ve así:
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
En la solución de Visual Studio, una de las bibliotecas de clase más externas (es decir, obtiene todas las referencias que puede), ha establecido un programa de depuración específico, destinado a la salida del proyecto Delphi. Esto nos permite depurar el código .NET de Visual Studio, aunque la mayor parte del programa está escrito en Delphi.
El problema solo ocurre cuando se ejecuta desde el depurador, no solo si ejecutamos el archivo exe directamente (ya sea mediante el explorador, los accesos directos o incluso Ctrl + F5 dentro de Visual Studio).
Aparentemente no hay spyware en la máquina (como lo insinúa).
¿Alguna otra cosa que podamos verificar?
Editar: parece que el depurador de .NET está habilitando estos indicadores SNaN, y el depurador Delphi no. Tendremos que investigar esto más a fondo, pero por el momento aceptaré la respuesta de @Lorenzo Boccaccia .
Aparentemente resuelto
Ok, parece que finalmente hemos resuelto este problema. El problema comenzó a ocurrir sin tener también conectado el depurador, para nuestros probadores, por lo que tuvimos que priorizar el problema.
Finalmente, encontramos un problema común con las máquinas que tenían el problema: son computadoras portátiles Dell Lattitude D620 con NVIDIA Quadro NVS 110M, con un controlador anterior de una imagen del sistema utilizada para aprovisionar las computadoras portátiles desde 2006.
Encontré una publicación en la web, aunque perdí la url cuando reinicié para actualizar el controlador de pantalla, que tenía un servicio .NET bloqueado, sobre todo cuando la máquina estaba ocupada haciendo algo en la pantalla. Una forma de reproducir su problema era abrir un símbolo del sistema en C: / y hacer un DIR /S
para forzar una gran cantidad de actualizaciones de pantalla, lo que desencadenaría el bloqueo.
Él también tenía una tarjeta de video NVIDIA.
El problema en mi máquina ocurrió aproximadamente cada 2-4 nuevas empresas de nuestro programa, pero después de actualizar el controlador de video, tuve 123 startups exitosas sin ningún problema. (Por cierto, puedo recomendar AutoHotKey para tales cosas).
Parece que hemos encontrado al culpable, un controlador NVIDIA viejo / defectuoso.
Se actualizó esta pregunta para que quizás alguien en el futuro pueda ahorrar algo de tiempo.
Ahora, si me disculpan, voy a ir a llorar en un rincón.
¡Jinxed!
Debo haberlo jinxed. Apenas publiqué la actualización anterior, la computadora portátil de un colega falló, después de actualizar el controlador de video.
Aún así, estoy seguro de que es un problema fuera de nuestra aplicación ahora, por lo que solo resta descubrir qué cosas específicas actualizar.
Más actualizaciones : Ok, mi máquina ahora parece estar arreglada, no así con la máquina de mis colegas. Hasta ahora hemos actualizado el BIOS, los controladores de chipset, y actualmente el SP3 para XP está en camino.
Se realizará una prueba de grabación esta noche, donde la aplicación se dejará en reposo durante la noche, ya que el problema surgió durante el inicio o en la primera vez que se ejecutó algún código WinForms .NET. Esta aplicación es principalmente una aplicación Delphi Win32, pero aloja el tiempo de ejecución .NET, y el problema parece estar relacionado con el código .NET. Cuando "iniciamos" el tiempo de ejecución .NET, el problema puede aparecer, o cuando disparamos la primera ventana .NET desde Win32, entonces también puede aparecer.
Estadísticamente estoy listo para lanzar este código ahora. Durante la noche, la aplicación se ha iniciado 3051 veces sin errores, mientras que antes de actualizar el controlador de video, se bloqueaba cada 2 o 4 veces.
Prodded y found (! /?)
Este calvario de corrección de errores se siente como ir al médico, donde se produce la siguiente conversación:
Doc: Does this hurt?
Me: No...
Doc: What about now?
He pinchado y pinchado la aplicación y, finalmente, creo que he encontrado algo que hice que introdujo este problema.
En nuestra aplicación alojamos el tiempo de ejecución de .NET, desde una aplicación Delphi 2007 Win32, y en nuestro código de pegamento tenemos la siguiente línea (ahora):
rc := CorBindToRuntimeEx(''v2.0.50727'', ''wks'',
STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN or STARTUP_CONCURRENT_GC,
@clsid, @iid, UnkRuntimeEngine);
Las dos constantes en el medio originalmente eran solo un 0, lo que significa que elije los valores predeterminados . Este cambio se introdujo hace unos meses y el problema se ha ido infiltrando poco a poco después de esto. El cambio se introdujo con el fin de alentar a ANTS profiler a cargar nuestra aplicación Win32 + host .NET runtime a fin de hacer perfiles de rendimiento y los cambios que introdujimos en ese momento lo hicieron funcionar. Además, el problema con el desbordamiento / subdesbordamiento aritmético ha ido empeorando lentamente, así que apuesto a que el problema no apareció por un tiempo después del cambio, por lo que no fue atribuido a ninguno de los cambios que hicimos.
Además, dado que solo (originalmente) vimos el problema al ejecutar el depurador, pensamos que algo andaba mal con Visual Studio y / o Delphi.
De todos modos, estadísticamente ahora, con un navegador en una pantalla haciendo desplazamientos repetidos arriba y abajo provocados por un javascript (aparentemente necesario para desencadenar el error), entonces he sido capaz de iniciar la aplicación con éxito 726 veces con un 0 en la llamada , y se cuelga 5 de 17 veces con las dos constantes allí.
Doc: Does this hurt?
Y no nos metamos en quién hizo ese cambio en primer lugar. Estoy seguro de que el culpable quiere que se lo deje en el anonimato ... tos
¿Siguen ocurriendo los errores si conecta el depurador después de iniciar la aplicación?
una versión de depuración de un dll vinculado podría compilarse con soporte de señalización y nan, vea http://blogs.msdn.com/oldnewthing/archive/2008/07/02/8679191.aspx para ver un ejemplo de este problema.
que heisenbug fue causado por variables no inicializadas, aquí podría haber un dll vinculado habilitando la función snan de la CPU y olvidando desactivarla al regresar