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:
-
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.