Si quelqu’un est un programmeur de système d’exploitation ou écrit un code de bibliothèque de niveau système, il est logique d’écrire un gestionnaire d’erreur de segmentation. Comme par exemple, le programmeur OS écrit le code et envoie un signal SIGSEGV à ce processus d’application. OU un programmeur de bibliothèque de systèmes peut gérer ce signal SIGSEGV et annuler les opérations provoquées par le code de la bibliothèque pour créer une erreur de segmentation. Mais pourquoi un programmeur d’application en C aurait-il besoin d’écrire un gestionnaire de fautes de segmentation? S’il écrit un gestionnaire, il a déjà corrompu certaines parties de la mémoire. Pouvez-vous donner à un programmeur d’application une instance capable de gérer les erreurs de segmentation et de poursuivre l’exécution du programme?
Le traitement de SIGSEGV
, etc., peut permettre de sauvegarder l’état et de prendre des mesures correctives. Mr 32 (et autres) sont corrects et vous ne pouvez pas simplement redémarrer le code de la ligne principale. Au lieu de cela, vous pouvez longjmp()
siglongjmp()
; Cela permet de redémarrer la ligne principale. En outre, vous devez faire très attention d’appeler uniquement les fonctions async safe
. C’est très délicat. Cependant, certaines applications sont,
Appeler exit()
n’est probablement pas bon et _exit()
serait meilleur. La différence étant les atexit()
.
Voir aussi: Cert async safe , Liste Glibc async-safe , Question similaire , longjmp()
et les signaux ne sont pas portables , async-safe
Celles-ci varient d’un système d’exploitation à l’autre. Tout conseil dépendra du système!
Problèmes supplémentaires
SIGSEGV
. Sans aucun doute, la version de la firebase database Empress l’accrochera. Vous devez savoir ce que vos bibliothèques utilisent et les enchaîner. jump_buf
sorte que votre gestion des erreurs peut être particulièrement paranoïaque. longjmp()
appelé depuis un signal n’est pas défini selon la norme C99, mais il fonctionnera bien sur la plupart des systèmes. siglongjmp()
peut être utilisé si vous êtes plus pédant. Ce serait bien pour la journalisation des diagnostics, mais je ne l’utiliserais pas pour les autres utilisations énumérées (sécurité, etc.). Notifier une tâche de surveillance peut être plus approprié. AFAIK, le gestionnaire de segmentation peut être écrit au niveau de l’application pour générer des informations de débogage (telles que le vidage de la mémoire, la valeur des registres et d’autres informations spécifiques à l’application), puis quitter l’application.
Veuillez noter que, étant donné que l’erreur de segmentation peut avoir corrompu la mémoire, il se peut qu’elle ne reçoive pas toutes les informations correctes.
Je ne suis au courant d’aucune situation dans laquelle l’exécution du programme peut être poursuivie après une erreur de segmentation. D’autres utilisateurs estimés de SO pourront peut-être apporter des éclaircissements à ce sujet.
Vous pouvez capter n’importe quel signal sauf SIGKILL, SIGCONT et SIGSTOP. Ainsi, vous pouvez attraper SIGSEGV, mais si vous décidez de ne pas quitter, le comportement sera imprévisible.
library programmer might handle that signal SIGSEGV and may undo the operations caused by the library code for creating segmentation
Une erreur de segmentation se produit signifie que les threads ou le processus seront arrêtés.
Vous ne pouvez pas annuler le code a causé l’erreur de segmentation. Vous pouvez plutôt redémarrer ce composant.
Une erreur de segmentation est causée par l’écriture du programme dans une partie de la mémoire qu’il n’est pas censé. Le développeur de l’application n’écrit pas de code pour gérer cela, il écrit pour l’éviter. C’est pourquoi vous devez vérifier lorsque vous écrivez en mémoire.