Forum Programmation.c Intercepter SIGSEGV

Posté par  .
Étiquettes : aucune
0
27
juin
2008
Salut à tous,

J'ai remarqué que quand un programme se prend une erreur de segmentation dans sa poire, il ne flush() pas ses sorties (pas testé pour d'autres signaux). Ça m'embête profondément pour un de mes projets, où les logs seront le seul moyen de déterminer ce qui s'est mal passé. J'ai donc décidé d'intercepter SIGSEGV, et de flush()er dans le handler (si vous avez une meilleure méthode, je suis preneur, sachant que c'est la seule modification autorisée dans le programme qui plantera potentiellement), un peu comme ça:


#include "stdio.h"
#include "signal.h"

void quitandclean() {
fclose(stdout);
fclose(stderr);
}

int main() {
char *x = NULL;
signal(SIGSEGV, quitandclean);
fprintf(stdout, "foo");
fprintf(stderr, "bar");
*x = 0;
}


Et là, horreur: le programme ne se termine plus en cas d'erreur de segmentation. Qu'ai-je donc mal fait ? (ce sera le "chercher l'erreur" du week-end ;))
  • # Le HANDLER !

    Posté par  . Évalué à 6.

    Qu'ai-je donc mal fait ?

    Ben t'as remplacé le handler par défaut, celui-là même qui est en charge de tuer ton programme, par le tien, et tu ne lui as rien dit d'autre. À titre d'info, la fonction signal() renvoie un sighandler du comportement précédant l'appel. Colle ça dans un registre de ton programme et rappelle-le manuellement à la fin de ta fonction.

    si vous avez une meilleure méthode, je suis preneur

    $ man setbuf
  • # Normal

    Posté par  . Évalué à 4.

    L'interruption SIGSEGV est interceptée, et dans la fonction que tu appelles dans ce cas, tu ne quittes pas le programme, donc c'est tout à fait logique que le programme ne se termine plus.
    Il faut que tu ajoutes un appel du genre _exit(ERROR_CODE); dans ton quitandclean.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.