Saltar al contenido

Mejores prácticas para recuperarse de una falla de segmentación

Estate atento porque en este enunciado hallarás la solución que buscas.Esta crónica ha sido aprobado por nuestros expertos para asegurar la calidad y exactitud de nuestro post.

Solución:

De hecho, es posible en C. Puedes lograrlo de una manera bastante complicada:

1) Controlador de señal de anulación

2) Uso setjump() y longjmp() para establecer el lugar para saltar hacia atrás, y realmente saltar de regreso allí.

Mira este código que escribí (idea tomada de “Expert C Programming: Deep C Secrets” de Peter Van Der Linden):

#include 
#include 
#include 

//Declaring global jmp_buf variable to be used by both main and signal handler
jmp_buf buf;


void magic_handler(int s)


    switch(s)
    

        case SIGSEGV:
        printf("nSegmentation fault signal caught! Attempting recovery..");
        longjmp(buf, 1);
        break;
    

    printf("nAfter switch. Won't be reached");





int main(void) 


    int *p = NULL;

    signal(SIGSEGV, magic_handler);

    if(!setjmp(buf))
    

         //Trying to dereference a null pointer will cause a segmentation fault, 
         //which is handled by our magic_handler now.
         *p=0xdead;

    
    else
    
        printf("nSuccessfully recovered! Welcome back in main!!nn"); 
    



    return 0;

La mejor práctica es solucionar el problema original que causó el volcado del núcleo, volver a compilar y luego reiniciar la aplicación.

Para detectar estos errores antes de implementarlos en la naturaleza, realice muchas revisiones por pares y escriba muchas pruebas.

Mi experiencia con las fallas de segmentación es que es muy difícil detectarlas de manera portátil, y hacerlo de manera portátil en un contexto de subprocesos múltiples es casi imposible.

Esto es por una buena razón: ¿Realmente espera que la memoria (que comparten sus subprocesos) esté intacta después de un SIGSEGV? Después de todo, acaba de demostrar que parte del direccionamiento está roto, por lo que la suposición de que el resto del espacio de memoria está limpio es bastante optimista.

Piense en un modelo de concurrencia diferente, por ejemplo, con procesos. Los procesos no comparten su memoria o solo una parte bien definida de ella (memoria compartida), y un proceso puede funcionar razonablemente cuando otro proceso muere. Cuando tiene una parte crítica del programa (por ejemplo, el control de la temperatura central), colocarlo en un proceso adicional lo protege de la corrupción de la memoria por parte de otros procesos. y fallas de segmentación.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *