2009-11-01 12 views
6

Im usando VS2008 y Mi aplicación MFC ha comenzado a bloquear al establecer puntos de interrupción o correr hasta el cursor. Recibo muchos errores como esto: -peralte de la vía de acceso hacia abajo violación 0xC00000FD

First-chance exception at 0x78a5727c (mfc90ud.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfffffffc. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000. 

La pila de llamadas no queda mucho, ya sea sólo en las listas de códigos NT.dll

> 00000000() 
    ntdll.dll!7c9032a8()  
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    ntdll.dll!7c90327a()  
    ntdll.dll!7c92aa0f()  
    ntdll.dll!7c90e48a()  
    ntdll.dll!7c9032a8()  

yo no soy capaz de encontrar el problema utilizando puntos de ruptura o caminando a través de mi código. La aplicación "parece" funcionar normalmente si se ejecuta utilizando F5 en VS.

¿Cuál es el mejor método para realizar un seguimiento de este problema hacia abajo?

+0

¿Usted intentó permitiendo a todas las excepciones en VS? Todavía no lo capta? – Naveen

+0

Sí, pero después de hacer eso recibo otra excepción que he rastreado de nuevo a la derecha después de que se llama el domodal inicial. Mi aplicación está basada en el asistente. Si habilito todas las excepciones, obtengo el problema original tal como se publicó. – Paul

+0

Haga clic con el botón derecho en sus fotogramas y cargue los símbolos para ntdll. No resolveremos nada, pero más información no puede doler. – sisve

Respuesta

5

¿Dónde está el desbordamiento de pila de su título de la pregunta? Las infracciones de acceso generalmente indican una desreferencia de puntero no válida.

Utilice su historial de revisión para encontrar la primera versión donde las cosas comenzaron a ir boom, luego analice críticamente todas las cosas del puntero que se encuentren dentro y alrededor del código modificado en esa revisión.

+0

Typo debe ser violación de acceso en el título. Podría hacerlo y pensar en eso, pero la aplicación tiene muchos meses de trabajo invertidos en esta etapa. Esperaba que hubiera una manera más rápida, pero si no, sería suficiente. – Paul

+0

Si le han dedicado muchos meses de trabajo, está usando algún sistema de control de fuente, ¿no? Si no, comienza a hacer eso * en este momento *. Seriamente. – Thomas

+0

Sí. He estado usando TortoiseSVN desde el principio. – Paul

0

Visual Studio tiene una opción en algún lugar para romper con la excepción de primera oportunidad (¿no recuerdas exactamente dónde está, tal vez un elemento de menú de excepción en el submenú de depuración?) Desea encenderlo y ver las pilas de llamadas momento en que ocurren.

También hay una opción para activar el servidor de símbolos de Microsoft, que descarga automáticamente los símbolos iguales para cualquier archivo DLL del sistema llegan a ver en la pila. (Lo siento, no recuerdo cómo exactamente esa configuración tampoco).

+0

Está en Debug | Excepciones | Excepciones Win32. La excepción anterior parece extrañamente familiar para la desreferenciación de punteros nulos. – MP24

2

Utilizaré mis habilidades de depuración psíquica y le digo que está sobrescribiendo un búfer que vive en la pila; específicamente, está escribiendo demasiados ceros en un búfer que no es lo suficientemente grande como para contenerlo.

Tiene los síntomas clásicos de una pila rota: el primer AV que está tratando de acceder a cero menos unos pocos bytes, claramente un desplazamiento desde su puntero a sus parámetros o sus variables locales. (Nunca puedo recordar cuáles están encima del puntero de la pila y cuáles están debajo). Luego tiene un grupo de líneas que indican que el puntero de la instrucción se ha puesto a cero, lo que sucede a menudo porque las direcciones de retorno de la función en la pila tienen se sobrescribió con valores cero, porque sobrescribió el búfer basado en pila y corrompió todas las otras cosas importantes en la pila. A medida que su programa intenta regresar de la función actual, busca en la pila para ver de dónde cree que proviene, ve el cero y salta allí mismo. ¡Ups!

Desde su pila está destrozada, no se puede encontrar el seguimiento de la pila demasiado útil; Es probable que sus estructuras de pila estén dañadas en este punto.

2

Hay algunas "plantillas" en la web que algunos utilizan para hacer sus programas de Windows En lugar de esto en WndProc()

case WM_CLOSE: 
    PostQuitMessage(SUCCESS); 
    break; 
case WM_DESTROY: 
    DestroyWindow(hwnd); 
    break; 

obtenemos esto:

case WM_CLOSE: 
    DestroyWindow(hwnd); 
    break; 
case WM_DESTROY: 
    PostQuitMessage(SUCCESS); 
    break; 

Si SUCCESS es 0, DestroyWindow() obtiene un puntero nulo que produce una excepción cuando la ventana está cerrada.

Cuestiones relacionadas