Question

Certaines fonctions C ++ bibliothèques abort call () dans le cas d'erreur (par exemple, SDL). Aucune information de débogage utile est fourni dans ce cas. Il est impossible de saisir abort appel et d'écrire des diagnostics de sortie connecter. Je voudrais remplacer ce comportement globalement sans réécriture / reconstruction de ces bibliothèques. Je voudrais jeter exception et le manipuler. Est-il possible?

Était-ce utile?

La solution

Notez que abort augmente le signal de SIGABRT, comme si elle appelait raise(SIGABRT). Vous pouvez installer un gestionnaire de signal qui est appelé dans cette situation, comme suit:

#include <signal.h>

extern "C" void my_function_to_handle_aborts(int signal_number)
{
    /*Your code goes here. You can output debugging info.
      If you return from this function, and it was called 
      because abort() was called, your program will exit or crash anyway
      (with a dialog box on Windows).
     */
}

/*Do this early in your program's initialization */
signal(SIGABRT, &my_function_to_handle_aborts);

Si vous ne pouvez pas empêcher les appels abort (par exemple, ils sont dus à des bugs qui fluage malgré vos meilleures intentions), cela pourrait vous permettre de recueillir des informations plus débogage. C'est portable ANSI C, donc il fonctionne sur Unix et Windows, et d'autres plates-formes aussi bien que ce que vous faites dans le gestionnaire d'abort ne sera souvent pas portable. Notez que ce gestionnaire est aussi appelé lorsqu'un assert échoue, ou même par d'autres fonctions d'exécution - par exemple, si malloc détecte la corruption tas. Ainsi, votre programme pourrait être dans un état fou pendant ce gestionnaire. Vous ne devriez pas allouer de la mémoire - tampons statiques d'utilisation si possible. Il suffit de faire le strict minimum pour recueillir les informations dont vous avez besoin, un message d'erreur à l'utilisateur, et quitter.

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

Autres conseils

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

Vous pouvez essayer d'écrire votre propre et d'obtenir à la place de std :: abort l'éditeur de liens pour appeler le vôtre. Je ne sais pas s'il est possible cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top