utilizan uso que punteros puntero programacion para los informatica declaracion como apuntador c++ windows segmentation-fault signals

uso - que es un puntero en c++



¿Hay alguna manera de obtener el puntero al que se accedió durante el manejo de una señal? (1)

Aproximadamente el código es este:

#include <signal.h> void SegmentationFaultHandler( int signal ) { if ( signal == SIGSEGV ) { // how to check here if it''s actual null pointer? Throw( NullPointerException, "Object pointer not set to an instance of an object." ); } else Throw( InvalidOperationException, "Signal has been intercepted by wrong function." ); } int main( ) { signal( SIGSEGV, SegmentationFaultHandler ); try { int *i = null; *i = 0; ...

¿Cómo puedo verificar si no revisé dos veces un puntero, o simplemente accedí a los datos no inicializados y lo deferencia?

Sé que es posible, porque los depuradores pueden saber a qué dirección intentó acceder el programa.


Parece que puede recuperar PEXCEPTION_POINTERS dentro de su controlador utilizando la variable global _pxcptinfoptrs que se declara dentro de signal.h. Luego use este puntero como en los ejemplos a continuación.

static void sigsegv_handler(int signo) { PEXCEPTION_POINTERS excptr = _pxcptinfoptrs; if (excptr != NULL) { } // ... }

Controlador de excepciones vectoriales

En Windows, puede usar el Controlador de excepciones de Vectored . Su controlador tendrá el siguiente aspecto:

LONG WINAPI ExceptionFilter( struct _EXCEPTION_POINTERS * pExceptionPointers ) {

entonces:

pExceptionPointers->ExceptionRecord->ExceptionCode

es usted el código de excepción, EXCEPTION_ACCESS_VIOLATION es cuando accede a la memoria no válida.

pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 0

es verdadero cuando se realizó la operación de lectura

pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 1

es para la operación de escritura

pExceptionPointers->ExceptionRecord->ExceptionInformation[1]

es la dirección que se estaba leyendo / escribiendo cuando ocurrió la excepción

Filtrado de excepciones estructuradas

Si no puede usar el manejador de excepciones vectorizadas, puede agregar __try / __ excepto en el nivel más bajo de su código, es decir. en main () o donde se está ejecutando la función de subprocesos:

__try { // Code which might cause access violation or any other hardware exceptions } __except(ExceptionFilter(GetExceptionInformation())) { }