Pregunta

Este es el día de comportamiento extraño.

Tenemos un proyecto Win32 hecho con Delphi 2007, que aloja .NET y en las llamadas .NET para mostrar nuevas formas, como parte de un período de transición.

Recientemente hemos empezado a experimentar una de las excepciones a que aparentemente aleatorios lugares y puntos de nuestro código:La aritmética de desbordamiento o subdesbordamiento.

El seguimiento de pila de uno de estos se parece a esto:

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, uno de los lugares más extremos de bibliotecas de clase (es decir.tira en todas las referencias que se puede), ha establecido un específico programa de depuración, dirigidos por el Delphi de resultados del proyecto.Esto nos permite depurar .NET de código de Visual Studio, aunque la mayor parte del programa está escrito en Delphi.

El problema sólo se produce cuando se ejecuta desde el depurador, no se si acabamos de ejecutar el archivo exe directamente (ya sea a través de explorer, atajos de teclado, o incluso Ctrl+F5 dentro de Visual Studio).

No hay aparentemente ningún spyware en el equipo (como se indicó por este).

Cualquier otra cosa que podemos comprobar?


Editar: Se parece a el .NET depurador es la habilitación de este Nan banderas, y el Delphi depurador no.Vamos a tener que investigar más a fondo, pero por ahora, voy a aceptar @Lorenzo Boccaccia's respuesta.

Aparentemente Resuelto

Ok, parece que por fin la hemos clavado este problema.El problema comenzó produciendo sin tener el depurador así, para nuestros testers, así que tuvimos que priorizar el problema de una forma de seguridad.

Finalmente hemos encontrado un problema común con las máquinas que tenía el problema, son Dell Latitud D620 portátiles con una NVIDIA Quadro NVS 110M, con un viejo conductor de un sistema de imagen que se utiliza para la provisión de los ordenadores portátiles, de nuevo en 2006.

He encontrado un post en la web, aunque he perdido la dirección url cuando se me reinicia a actualizar el controlador de pantalla, que tenía una .RED de servicio de estrellarse, principalmente cuando la máquina estaba ocupado haciendo algo en la pantalla.Una manera de reproducir su problema era abrir un símbolo del sistema en C:\ y haciendo un DIR /S sólo la fuerza de una enorme cantidad de actualizaciones de pantalla, lo que daría lugar del accidente.

Él también tenía una tarjeta de video NVIDIA.

El problema en mi máquina se produjo aproximadamente cada 2 a 4 empresas de nueva creación de nuestro programa, pero después de actualizar el controlador de vídeo he tenido 123 de éxito de startups sin ningún tipo de problemas.(Por CIERTO que me puede recomendar AutoHotKey para este tipo de cosas).

Así que parece que hemos encontrado al culpable, un viejo/buggy driver de NVIDIA.

Actualizado esta pregunta, así que tal vez alguien en el futuro puede ahorrar algo de tiempo.

Ahora, si me disculpáis, voy a ir a llorar en un rincón.

Jinxed!

Debe de haber jinxed ella.Apenas había publicado la anterior actualización de un colega portátil no, después de actualizar el controlador de vídeo.

Aún así, estoy seguro de que es un problema fuera de nuestra aplicación, así que sólo me queda averiguar qué cosas específicas para actualizar.


Más actualizaciones:Ok, mi máquina es ahora, al parecer, fijo, no así con mis colegas de la máquina.Hasta ahora hemos actualizado la BIOS, controladores de Chipset, y en la actualidad el SP3 para XP está en camino.

Una quemadura-en el examen se realizará esta noche, en la que la aplicación se deja durante la noche la puesta en marcha, como el problema surgido durante el inicio, o en el primer tiempo, algunos WinForms .NET de código se ejecuta.Esta aplicación es principalmente un Delphi Win32 app, pero tiene la .NET, y el problema parece estar relacionado con el mismo .NET de código.Cuando nos "arranque" de la .NET, el problema puede aparecer, o cuando tenemos el fuego de la primera .NETO de la ventana de Win32, a continuación, también puede aparecer.


Estadísticamente estoy listo para lanzar este código ahora.En la noche de la aplicación se ha iniciado 3051 veces sin errores, mientras que antes he actualizado el controlador de vídeo que se colgaba cada 2 a 4 veces.

Pinchó y se encontró(!/?)

Este error de fijación de prueba se siente como ir al médico, donde la siguiente conversación se produce:

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

He pinchado y asomó la aplicación y finalmente creo que he encontrado algo que hizo que presentó este problema.

En nuestra aplicación hemos de host de la .NET, de un Delphi 2007 aplicación Win32, y en nuestro pegamento-código tenemos la siguiente línea (ahora):

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

Los dos constantes en el medio hubo un principio, sólo un 0, lo que significa elegir los valores predeterminados.Este cambio se introdujo hace unos meses, y el problema ha sido poco a poco subido nosotros después de esta.El cambio se introdujo en el fin de alentar a las HORMIGAS del analizador para cargar nuestra aplicación Win32 + alojado .NET con el fin de hacer perfiles de rendimiento y los cambios que hemos introducido en aquel entonces hizo que el trabajo.Además, el problema con la aritmética de desbordamiento/subdesbordamiento poco a poco ha ido empeorando así que creo que el problema no aparecer por un tiempo después de que el cambio no era atribuida a cualquiera de los cambios que hicimos.

También, ya que sólo (originalmente) vio el problema cuando se ejecuta a través del depurador, pensamos que algo estaba mal con Visual Studio y/o Delphi.

De todos modos, estadísticamente ahora, con un navegador en una pantalla haciendo repite el desplazamiento hacia arriba y hacia abajo provocado por un javascript (aparentemente necesarias, a fin de desencadenar el error), entonces he sido capaz de iniciar la aplicación 726 veces con un 0 en la convocatoria, y se cuelga de 5 de 17 veces con las dos constantes de allí.

Doc: Does this hurt?

Y no vamos a entrar en que hizo ese cambio en el primer lugar.Estoy seguro de que el culpable quiere quedar en el anonimato... tos

¿Fue útil?

Solución

una versión de depuración de un vinculados dll podría ser compilado con señalización nan apoyo, ver http://blogs.msdn.com/oldnewthing/archive/2008/07/02/8679191.aspx para un ejemplo de este problema.

que heisenbug fue causada por variables no inicializadas, aquí podría estar vinculada a una dll de habilitación de la nan característica de la cpu y el olvido para desactivarlo al regresar

Otros consejos

Los errores ocurren, todavía se producen si se va a colocar el depurador después de iniciar la aplicación?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top