2010-04-14 18 views
11

Estoy intentando depurar un problema en una DLL escrita en C que sigue causando violaciones de acceso. Estoy usando Visual C++ 2008, pero el código es directo C.¿Cómo puedo hacer que el depurador de VC++ se salga de las excepciones?

Estoy acostumbrado a Delphi, donde si se produce una excepción mientras se ejecuta bajo el depurador, el programa inmediatamente pasará al depurador y le dará una oportunidad de examinar el estado del programa. En Visual C++, sin embargo, todo lo que obtengo es un mensaje en la pestaña Salida:

First-chance exception at blah blah blah: Access violation reading location 0x04410000. Sin interrupciones, nada. Simplemente va y desenrolla la pila hasta que está de vuelta en mi Delphi EXE, que reconoce que algo está mal y me alerta allí, pero en ese punto he perdido varias capas de la pila de llamadas y no sé lo que está pasando.

He intentado otras técnicas de depuración, pero lo que sea que esté ocurriendo es tener lugar dentro de un ciclo anidado dentro de una macro C que se llama más de 500 veces, y eso es un poco más de mi habilidad (o mi paciencia) para seguimiento a través de.

Me imagino que tiene que haber alguna forma de obtener la excepción de "primera oportunidad" para realmente darme una "oportunidad" de manejarlo. Probablemente haya alguna configuración de configuración de "interrupción inmediata en excepciones de primera oportunidad" que desconozco, pero que no parece ser tan reconocible.

¿Alguien sabe dónde está y cómo habilitarlo?

Respuesta

16

En el menú Depurar , seleccione excepciones y marque las casillas de las excepciones desea el depurador para romper sucesivamente. "Infracción de acceso" se encuentra en "Excepciones de Win32".

+0

Gracias. Eso funciono. Me pregunto por qué la Infracción de acceso no está marcada de manera predeterminada ... –

+0

@Mason: No hay problema. No creo que ninguno de ellos esté marcado por defecto. Supongo que hay una penalización de rendimiento bastante significativa cuando se habilita "break on exception" (aunque realmente no lo sé). –

+0

No lo creo. No sé C++ todo muy bien, pero en Delphi, la penalización de rendimiento es cero hasta que realmente se rompe en uno, y cuando (si) lo hace, eso generalmente significa que algo salió mal y el depurador está exactamente donde quieres ser. –

1

También puede crear un punto de interrupción de datos usando la dirección especificada en la línea "Primera excepción en ...".

Siguiendo con la respuesta de James, las excepciones que está buscando están debajo de la sección de excepciones de Win32. Debería ver la Infracción de acceso allí.

+0

¿Eso funcionaría? Este es un error de "lectura de", y los puntos de interrupción de datos AFAIK solo se activan si cambia el valor en la dirección en cuestión. –

+0

Puede interrumpir cuando la ejecución también llega a una ubicación específica (creo que es solo una opción en el diálogo de propiedades de punto de interrupción). –

Cuestiones relacionadas