126 votes

Exécuter une application dans la BDG jusqu'à ce qu'une exception se produise

Je suis en train de travailler sur une application multithread, et je veux le débogage à l'aide de GDB.

Problème, c'est l'un de mes fils ne cesse de mourir avec le message:

pure virtual method called
terminate called without an active exception
Abort

Je sais que la cause de ce message, mais je n'ai aucune idée d'où dans mon fil il se produit. Un backtrace serait vraiment utile.

Quand je lance mon application dans GDB, il s'arrête à chaque fois qu'un thread est suspendu ou reprise. Je veux que mon application continue de fonctionner normalement jusqu'à ce que l'un des fils meurt à cette exception près, à quel point tout devrait arrêter que je peux obtenir une trace.

180voto

Dan Points 1752

Vous pouvez essayer d'utiliser un "catchpoint" (catch throw) pour arrêter le débogueur au moment où l'exception est générée.

Le suivant , extrait De la gdb manuel décrit les catchpoint fonctionnalité.


5.1.3 Configuration catchpoints

Vous pouvez utiliser catchpoints pour provoquer l'arrêt du débogueur pour certains types d'événements, tels que des exceptions C++ ou le chargement d'une bibliothèque partagée. Utilisation de la prise de commande pour définir un catchpoint.

  • capture de l'événement

    Arrêter lorsque l'événement se produit. l'événement peut être l'un des suivants:

    • jeter

      Le lancement de l'une des exceptions C++.

    • catch

      La capture de l'une des exceptions C++.

    • exec

      Un appel à exec. Ce n'est actuellement disponible pour HP-UX.

    • fourche

      Un appel à la fourchette. Ce n'est actuellement disponible pour HP-UX.

    • vfork

      Un appel à vfork. Ce n'est actuellement disponible pour HP-UX.

    • la charge ou la charge libname

      Le chargement dynamique de bibliothèque partagée, ou le chargement de la bibliothèque libname. Ce n'est actuellement disponible pour HP-UX.

    • décharger ou décharger libname

      Le débarquement de chargement dynamique d'une bibliothèque partagée, ou le déchargement de la bibliothèque libname. Ce n'est actuellement disponible pour HP-UX.

  • tcatch événement

    Définir un catchpoint qui est activé uniquement pour un seul arrêt. Le catchpoint est automatiquement supprimé après la première fois que l'événement est capturé.

Utiliser l' info break de la commande à la liste de l'actuel catchpoints.

Actuellement, il existe certaines limites à la gestion des exceptions C++ (catch à lancer et à rattraper) dans GDB:

* If you call a function interactively, GDB normally returns control to you when the function has finished executing. If the call raises an exception, however, the call may bypass the mechanism that returns control to you and cause your program either to abort or to simply continue running until it hits a breakpoint, catches a signal that GDB is listening for, or exits. This is the case even if you set a catchpoint for the exception; catchpoints on exceptions are disabled within interactive calls.

* You cannot raise an exception interactively.

* You cannot install an exception handler interactively.

Parfois des captures n'est pas la meilleure façon de déboguer la gestion des exceptions: si vous avez besoin de savoir exactement où une exception est levée, il est mieux d'arrêter avant que le gestionnaire d'exception est appelé, car de cette façon, vous pouvez voir la pile avant tout de déroulement. Si vous définissez un point d'arrêt dans un gestionnaire d'exception au lieu de cela, il peut ne pas être facile de savoir d'où l'exception a été soulevée.

Pour s'arrêter juste avant un gestionnaire d'exception est appelé, vous devez avoir quelques connaissances de la mise en œuvre. Dans le cas de GNU C++, les exceptions soulevées par l'appel d'une fonction de la bibliothèque nommée __soulever_exception qui est le suivant ANSI C interface:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Pour faire le débogueur attraper toutes les exceptions avant tout le déroulement de pile a lieu, définissez un point d'arrêt sur l' __soulever_exception (voir la section points d'arrêt; les points d'observation; et les exceptions).

Avec un point d'arrêt conditionnel (voir la section conditions d'arrêt) qui dépend de la valeur de l'id, vous pouvez arrêter votre programme si une exception est levée. Vous pouvez utiliser plusieurs points d'arrêt conditionnels pour arrêter votre programme lorsque l'un quelconque d'un certain nombre d'exceptions.

5voto

Steve Folly Points 2373

Définir un point d'arrêt sur __pure_virtual

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X