web-dev-qa-db-fra.com

Comment définir des points de montres persistants et conditionnels sur des variables scopées localement?

  1. Si je fixe un point de vue pour une variable locale à la portée actuelle, elle sera supprimée automatiquement lors de la sortie de la portée. Y a-t-il un moyen de la définir une fois et de le conserver automatiquement lorsque vous entrez dans la même portée?

  2. Y a-t-il de toute façon pour définir la montre conditionnelle, comme watch var1 if var1==0? Dans mon cas, l'état ne fonctionne pas. GDB s'arrête chaque fois que var1 La valeur est modifiée, au lieu de jusqu'à var1 == 0 est vrai. Mon GDB est =GNU GDB 6.8-Debian.

38
Tim

Je suis d'accord avec Dave qu'un point d'arrêt conditionnel est la voie à suivre.

Cependant, pour faire ce que vous avez demandé, vous pouvez utiliser la commande commands de GDB pour définir une liste de commandes GDB pour exécuter chaque fois qu'un point d'arrêt est touché. Je trouve cela incroyablement utile.

Je suggère d'écrire vos commandes GDB dans un fichier afin de pouvoir être facile à éditer et à recharger facilement avec la commande source. Ou vous pouvez spécifier des fichiers de commande à charger sur la ligne de commande GDB ou utiliser .gdbinit pour les faire charger automatiquement.

Un exemple d'une bonne utilisation de commands:
[.____] Supposons que j'ai une fonction format qui s'appelle de nombreuses autres fonctions. Je veux rompre dessus, mais seulement après la fonction do_step_3 a été appelé.

break do_step_3
commands
  break format
  continue
end

Vous pouvez utiliser cela pour votre problème avec quelque chose comme:

break func
commands
  watch var
  continue
end
33
Zan Lynx

Vous pouvez définir des conditions sur les points de vue de la même manière que vous faites avec des points d'arrêt. Ceci est dans la documentation mais certes, cela fait preuve d'attention à elle-même.

Donc watch my_var if my_var > 3 fonctionne parfaitement, de même que la commande condition.

Pour recréer le point de vue si la variable qu'il regarde est hors de portée, GDB dispose-t-il d'utiliser automatiquement un point d'arrêt au début de la fonction que ZAN a décrit.

14
Robie Basak

Vous pouvez définir un point de vue qui ne dépasse pas de portée en la définissant à l'adresse mémoire.

(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0

Cela fonctionne également pour d'autres types de données et des pointeurs.

8
Daniel Spång