Retourner aux forums || Retourner au forum Programmation.c
Programmation.c : Intercepter SIGSEGV
Posté par Moonz () le 27 juin 2008J'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 ;))
> Lire le message (2 commentaires, moyenne: 5).
Le HANDLER !
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
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.
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.