Pregunta

¡Por favor ayuda! Estoy realmente en el final de mi ingenio. Mi programa es un pequeño administrador de notas personales (google para " cintanotes "). En algunas computadoras (y, por supuesto, no tengo ninguna) se bloquea con una excepción no controlada justo después del inicio. No se puede decir nada especial acerca de estas computadoras, excepto que tienden a tener CPU AMD.

Entorno: Windows XP, Visual C ++ 2005/2008, WinApi en bruto.

Esto es lo que es seguro acerca de este " Heisenbug " ;:

1) El bloqueo solo ocurre en la versión de lanzamiento.

2) El bloqueo desaparece tan pronto como elimino todas las cosas relacionadas con GDI.

3) BoundChecker no tiene quejas.

4) ¡Escribir un registro muestra que el bloqueo ocurre en una declaración de una variable int local! ¿Cómo es posible? Corrupción de memoria?

¡Cualquier idea sería muy apreciada!

ACTUALIZACIÓN: he logrado que la aplicación se depure en un " defectuoso " ORDENADOR PERSONAL. Los resultados:

" Excepción no controlada en 0x0044a26a en CintaNotes.exe: 0xC000001D: Instrucción ilegal. "

y saltos de código en

0044A26A cvtsi2sd xmm1, dword ptr [esp + 14h]

Por lo tanto, parece que el problema estaba en el " Generación de código / Habilitar conjunto de instrucciones mejorado " Opción de compilador. Se estableció en " / arch: SSE2 " y se estrellaba en las máquinas que no soportaban SSE2. He establecido esta opción en " No establecido " y el error se ha ido. ¡Uf!

¡Muchas gracias a todos por ayuda!

¿Fue útil?

Solución

¿Entonces no se bloquea cuando la configuración es DEBUG Configuration? Hay muchas cosas diferentes a una configración de LIBERACIÓN: 1.) Inicialización de globales. 2.) Código de máquina real generado, etc.

El primer paso es averiguar cuáles son las configuraciones exactas para cada parámetro en el modo LIBERACIÓN en comparación con el modo DEBUG.

-AD

Otros consejos

  

4) ¡Escribir un registro muestra que el bloqueo se produce en una declaración de una variable int local! ¿cómo es posible? Corrupción de memoria?

¿Cuál es el código subyacente en el ejecutable / ensamblado? La declaración de int no contiene ningún código, y como tal no puede fallar. ¿Inicializa el int de alguna manera?

Para ver el código donde ocurrió la falla, debe realizar lo que se llama un análisis postmortem.

Informe de errores de Windows

Si desea analizar el bloqueo, debería obtener un volcado de memoria. Una opción para esto es registrarse para el Informe de errores de Windows: requiere algo de dinero (necesita una identificación de firma de código digital) y algunos formularios de llenado. Para obtener más información, visite https://winqual.microsoft.com/ .

Obtenga el volcado de emergencia destinado a WER directamente del cliente

Otra opción es ponerse en contacto con algún usuario que esté experimentando el bloqueo y obtener de él un volcado directo destinado a WER. El usuario puede hacer esto cuando hace clic en los detalles técnicos antes de enviar el bloqueo a Microsoft: la ubicación del archivo de volcado de volcado se puede consultar allí.

Tu propio minidump

Otra opción es registrar su propio controlador de excepciones, manejar la excepción y escribir un minidump en cualquier lugar que desee. Puede encontrar una descripción detallada en Code Project Post-Mortem Depuración de su aplicación con minidumps y Visual Studio. Artículo NET .

  

1) El bloqueo solo ocurre en la versión de lanzamiento.

Eso suele ser una señal de que estás confiando en algún comportamiento que no está garantizado, pero que es cierto en la versión de depuración. Por ejemplo, si olvida inicializar sus variables o accede a una matriz fuera de límites. Asegúrese de haber activado todas las comprobaciones del compilador (/ RTCsuc). También verifique cosas como confiar en el orden de evaluación de los parámetros de la función (lo cual no está garantizado).

  

2) El bloqueo desaparece tan pronto como elimino todas las cosas relacionadas con GDI.

Tal vez sea un indicio de que estás haciendo algo mal con las cosas relacionadas con GDI. ¿Está utilizando HANDLE después de haber sido liberados, por ejemplo?

Descargue el paquete herramientas de depuración para Windows . Establezca las rutas de los símbolos correctamente, luego ejecute su aplicación bajo WinDbg. En algún momento, se romperá con una infracción de acceso. Luego, debe ejecutar el comando "! Analyse -v "

La mayoría de los errores de Heisen / de solo liberación se deben a un flujo de control que depende de las lecturas de la memoria no inicializada / los punteros pasados ??/ al final de los búferes, a las condiciones de la carrera, o a ambas.

Intente anular los asignadores para que se apaguen la memoria al asignar. ¿El problema desaparece (o se vuelve más reproducible?)

  

¡Escribir un registro muestra que el bloqueo ocurre en una declaración de una variable int local! ¿Cómo es posible? Corrupción de memoria?

Desbordamiento de pila! ;)

  

4) ¡Escribir un registro muestra que el bloqueo se produce en una declaración de una variable int local! ¿Cómo podría ser eso? Corrupción de la memoria

He encontrado la causa de numerosos " extraños choques " para eliminar la referencia de un esto roto dentro de una función miembro de dicho objeto.

¿Qué dice el accidente? ¿Violación de acceso? ¿Excepción? Esa sería la pista adicional para resolver esto con

Asegúrese de que no haya daños en la memoria antes de usar PageHeap.exe

Asegúrese de no tener un desbordamiento de pila (matriz CBig [1000000])

Asegúrese de que no tiene memoria no inicializada.

Además, puede ejecutar la versión de lanzamiento también dentro del depurador, una vez que genere símbolos de depuración (no es lo mismo que crear una versión de depuración) para el proceso. Recorra y vea si está recibiendo alguna advertencia en la ventana de seguimiento del depurador.

" 4) ¡Escribir un registro muestra que el bloqueo ocurre en una declaración de una variable int local! ¿Cómo es posible? Corrupción de memoria? & Quot;

Esto podría ser una señal de que el hardware es, de hecho, defectuoso o está siendo presionado demasiado. Averigüe si han overclockeado su computadora.

Cuando obtengo este tipo de cosas, intento ejecutar el código a través de gimpels PC-Lint (análisis de código estático) ya que verifica diferentes clases de errores en BoundsChecker. Si está utilizando Boundschecker, active las opciones de envenenamiento de memoria.

Mencionas CPUs AMD. ¿Ha investigado si hay una versión de tarjeta gráfica / controlador y / o configuración similar en las máquinas que fallan? ¿Se bloquea siempre en estas máquinas o solo ocasionalmente? Tal vez ejecute la herramienta de información del sistema en estas máquinas y vea lo que tienen en común,

A mí me suena a corrupción de pila. Mi herramienta favorita para localizarlos es IDA Pro . Por supuesto, no tiene ese acceso a la máquina del usuario.

Algunos revisores de memoria tienen dificultades para atrapar la corrupción de la pila (si es así). La forma más segura de obtenerlos es el análisis en tiempo de ejecución.

Esto también puede deberse a daños en una ruta de excepción, incluso si la excepción fue manejada. ¿Depura con "capturar excepciones de primera oportunidad" activadas? Deberías mientras puedas. Se vuelve molesto después de un tiempo en muchos casos.

¿Puede enviar a esos usuarios una versión verificada de su aplicación? Echa un vistazo a Minidump Maneja esa excepción y escribe un basurero. Luego use WinDbg para realizar una depuración en su extremo.

Otro método es escribir registros muy detallados. Cree un " Registrar cada acción " y pídale al usuario que lo encienda y que también lo envíe. Volcar la memoria a los registros. Echa un vistazo a '_CrtDbgReport ()' en MSDN.

¡Buena suerte!

EDITAR:

Respondiendo a su comentario: un error en una declaración de variable local no me sorprende. He visto esto mucho Normalmente se debe a una pila dañada.

Algunas variables en la pila pueden estar corriendo sobre sus límites, por ejemplo. Todo el infierno se desata después de eso. Luego, las declaraciones de variables de la pila producen errores de memoria aleatorios, las tablas virtuales se corrompen, etc.

Cada vez que los he visto durante un período de tiempo prolongado, he tenido que ir a IDA Pro. La depuración detallada del desmontaje en tiempo de ejecución es la única cosa que sé que realmente los obtiene de manera confiable.

Muchos desarrolladores usan WinDbg para este tipo de análisis. Es por eso que también sugerí Minidump.

Pruebe Rational (IBM) PurifyPlus. Atrapa muchos errores que BoundsChecker no hace.

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