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? P>
3 Réponses :
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. P>
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. P>
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. Citation>
Notez que si vous ne pouvez pas empêcher les appels Certaines plates-formes peuvent permettre à la suite de leurs fonctions code> à personnaliser. Par exemple, sur Windows, Visual C ++ a une fonction Abort code> augmente le signal
SIGABRT code>, comme si elle s'appelle
lever (sigabrt) code>. Vous pouvez installer un gestionnaire de signal qui est appelé dans cette situation, comme:
abandonner code> 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 code> échoue, voire par d'autres fonctions d'exécution - disons, si
malloc code> 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. P>
_set_abort_behavior code>
qui vous permet de choisir si un message est affiché ou non à l'utilisateur, et si les décharges de bloc sont collectées. P> P>
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 code>,
Supprimer code> 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? "