J'utilise une application via gdb et je souhaite définir un point d'arrêt à chaque fois qu'une variable spécifique est accédée/modifiée. Y a-t-il une bonne méthode pour le faire? Je serais également intéressé par d'autres façons de surveiller une variable en C/C++ pour voir si/quand il change.Puis-je définir un point d'arrêt sur 'l'accès mémoire' dans GDB?
Répondre
montre ne se casse à l'écriture, rwatch vous permettent de briser le lire, et awatch vous laissez pause sur lecture/écriture.
Vous pouvez définir lire watchpoints sur les emplacements mémoire:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
mais une limitation s'applique aux commandes rwatch et Awatch; vous ne pouvez pas utiliser des variables gdb dans les expressions:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
donc vous devez les développer vous-même:
gdb$ print $ebx
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
Value = 0xec34daf
0x9527d6e7 in objc_msgSend()
Edit: Oh, et par la manière. Vous avez besoin du matériel ou du support logiciel. Le logiciel est évidemment beaucoup plus lent. Pour savoir si votre système d'exploitation prend en charge les points de surveillance matériels, vous pouvez voir le paramètre d'environnement can-use-hw-watchpoints.
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
Je viens d'essayer ce qui suit:
$ cat gdbtest.c
int abc = 43;
int main()
{
abc = 10;
}
$ gcc -g -o gdbtest gdbtest.c
$ gdb gdbtest
...
(gdb) watch abc
Hardware watchpoint 1: abc
(gdb) r
Starting program: /home/mweerden/gdbtest
...
Old value = 43
New value = 10
main() at gdbtest.c:6
6 }
(gdb) quit
Il semble donc possible, mais vous ne semblent avoir besoin d'un support matériel.
Si votre plate-forme ne prend pas en charge les points de surveillance matériels, gdb doit revenir à un point de surveillance logiciel. – Tod
En supposant que la première réponse fait référence à la syntaxe C comme (char *)(0x135700 +0xec1a04f)
alors la réponse à faire rwatch *0x135700+0xec1a04f
est incorrect. La syntaxe correcte est rwatch *(0x135700+0xec1a04f)
.
L'absence de ()
s m'a fait beaucoup de mal à essayer d'utiliser les points de surveillance moi-même.
Oui, vous pouvez. http://www.technochakra.com/debugging-types-of-data-breakpoints-in-gdb/ traite de divers points d'arrêt de données pour gdb.
Le lien est devenu obsolète. – eush77
Utilisez la fonction de surveillance pour voir quand une variable est écrite, rwatch lorsqu'elle est lue et awatch lorsqu'elle est lue/écrite depuis/vers, comme indiqué ci-dessus. Toutefois, notez que pour utiliser cette commande, vous devez rompre le programme et la variable doit être dans la portée lorsque vous avez rompu le programme:
Utilisez la commande watch. L'argument de la commande watch est une expression évaluée. Cela implique que le variabel que vous voulez pour définir un point de surveillance doit être dans la portée actuelle. Ainsi, pour définir un point de contrôle sur une variable non globale, vous devez avoir défini un point d'arrêt qui arrêtera votre programme lorsque la variable est dans la portée. Vous définissez le point de contrôle après les pauses du programme.
Qu'est-ce que vous cherchez est appelé point d'observation.
Utilisation
(gdb) watch foo
: regarder la valeur de variablesfoo
(gdb) watch *(int*)0x12345678
: regarder la valeur pointée par une adresse, casté à tout type que vous voulez
(gdb) watch a*b + c/d
: montre arbitrairement expression complexe, va couvercle dans la langue maternelle du programme
Les points d'observation sont de trois types:
- montre: gdb se brisera quand un écriture se
- rwatch: gdb cassera wnen une lire se produit
- awatch: gdb se casse les deux cas
Vous pouvez choisir le plus approprié pour vos besoins.
Pour plus d'informations, consultez this.
J'ai écrit ** une autre ** réponse parce que les existantes ne me semblaient pas très simples ... –
- 1. gdb, définir le point d'arrêt sur toutes les fonctions d'un fichier
- 2. gdb breakpoint sur pthread_create
- 3. GDB comment arrêter l'exécution sans point d'arrêt?
- 4. gdb dans emacs sur Windows
- 5. comment puis-je mettre un point d'arrêt sur "quelque chose est imprimé sur le terminal" dans gdb?
- 6. Comment mettre un point d'arrêt sur un emplacement mémoire dans dbx?
- 7. Zoom sur un point dans C#
- 8. type attendu sur un point dans vb.net?
- 9. comment définir le point d'arrêt de cette manière?
- 10. Dessiner un point sur l'écran
- 11. Puis-je passer un client gdb sur XCode?
- 12. Points d'arrêt GDB
- 13. Comment déboguer le point d'entrée du processus fork-exec dans GDB?
- 14. Débogage dans Visual Studio 2008 sans définir de point d'arrêt
- 15. doute sur une queue de code optimisé sous « gdb »
- 16. dessine un point sur linechart en flex
- 17. Comment définir les correspondances {min, max} dans le point d'ancrage
- 18. GDB: Obtenir un nom de symbole à partir d'une adresse mémoire
- 19. comment définir la mise au point dans l'index requis sur la zone de texte pour l'opéra
- 20. Puis-je ajouter un point d'arrêt sur CreateProcess dans VS
- 21. Mise au point sur un QDockWidget tabulé dans PyQt
- 22. Passage à l'assembly dans gdb
- 23. Comment définir des points d'arrêt sur les futures bibliothèques partagées avec un indicateur de commande
- 24. Comment calculer un point sur un axe pivoté?
- 25. Trouver un point dans un polygone complexe
- 26. Impossible de définir un point d'arrêt dans la page ASPX s'exécutant sous WSS
- 27. Comment puis-je insérer une chaîne de temps dans un journal GDB?
- 28. Définition d'un point d'arrêt de données dans Visual Studio 2005 sur l'adresse d'un pointeur déréférencé
- 29. Comment désassemblez-vous un opérateur surchargé dans gdb?
- 30. Restaurer à un point dans le temps
Si vous voulez regarder un membre d'une méthode C++, j'ai trouvé cette variante immensément utile: 'watch -location mTextFormatted'. –
Et si je n'ai pas l'adresse d'une variable? Puis-je utiliser son nom? –
Vous pouvez demander à GDB d'imprimer l'adresse de la variable avec l'opérateur address-of. 'print & variable' – Loduwijk