7
votes

C ++ Abander la dérogation

Certaines bibliothèques C ++ Call Abort () Fonction dans le cas d'une erreur (par exemple, SDL). Aucune information de débogage utile n'est fournie dans ce cas. Il n'est pas possible d'attraper un appel d'abandon et d'écrire une sortie de journal de diagnostic. Je voudrais remplacer ce comportement globalement sans réécriter / reconstruire ces bibliothèques. Je voudrais faire une exception et le gérer. Est-ce possible?


0 commentaires

3 Réponses :


0
votes

Vous pouvez essayer d'écrire votre propre et d'obtenir le lien de lien à vous appeler à la place de STD :: Abort. Je ne suis pas sûr si cela est possible cependant.


0 commentaires

3
votes

Selon la page Man de Linux, Abort () génère un SIGABRT au processus qui peut être capturé par un gestionnaire de signal. Edit: Ben a confirmé que cela est possible sur Windows - voir son commentaire ci-dessous.


1 commentaires

La fonction d'avortement de Visual C ++ fait aussi. Void Abort () - Abandonnez le programme actuel en relevant le but SIGABRT: imprimez un message d'avortement et augmentez le signal SIGABRT. Si l'utilisateur n'a pas défini une routine de gestionnaire d'avortement, résiliez le programme avec l'état de sortie de 3 sans nettoyer.



17
votes

Notez que Abort augmente le signal SIGABRT , comme si elle s'appelle lever (sigabrt) . Vous pouvez installer un gestionnaire de signal qui est appelé dans cette situation, comme: xxx

si vous ne pouvez pas empêcher les appels abandonner Aux bugs qui se glissent malgré vos meilleures intentions), cela pourrait vous permettre de collecter des informations supplémentaires de débogage. Ceci est portable ANSI C, de sorte qu'il fonctionne sur Unix et Windows, ainsi que d'autres plates-formes, bien que ce que vous faites dans le gestionnaire d'avort ne soit souvent pas portable. Notez que ce gestionnaire est également appelé lorsqu'un affirme échoue, voire par d'autres fonctions d'exécution - disons, si malloc détecte la corruption du tas. Donc, votre programme pourrait être dans un état fou pendant ce gestionnaire. Vous ne devriez pas allouer la mémoire - utiliser des tampons statiques si possible. Faites simplement le strict minimum pour collecter les informations dont vous avez besoin, obtenir un message d'erreur à l'utilisateur et quittez.

Certaines plates-formes peuvent permettre à la suite de leurs fonctions à personnaliser. Par exemple, sur Windows, Visual C ++ a une fonction _set_abort_behavior qui vous permet de choisir si un message est affiché ou non à l'utilisateur, et si les décharges de bloc sont collectées.


3 commentaires

Et si mon_function_to_handle_aborts jette? )


@Pavel: C'est défini sur la mise en œuvre, c'est-à-dire non portable. Fondamentalement, vous êtes assuré de pouvoir utiliser les fonctionnalités de C, mais vous ne pourrez peut-être pas utiliser de fonctionnalités C ++ telles que la déclaration de variables, appelant nouveau , Supprimer ou des exceptions. Dans beaucoup d'implémentations, cela pourrait fonctionner, cependant. En outre, la fonction est supposée avoir une liaison C - j'ai modifié la réponse, mais il est peu probable de faire une différence sur Windows ou UNIX.


Que mettrez-vous dans la fonction de gestionnaire pour montrer ce qui a causé l'erreur? GDB aurait-il touché un point d'arrêt dans cette fonction et montrerait une trace de pile valide? "