73 votes

Comment faire une action spécifique lorsqu'un certain point d'arrêt est atteint dans GDB ?

Je cherche un moyen d'effectuer une action lorsqu'un point d'arrêt particulier est atteint dans gdb.

En fait, j'ai une faille dans mon programme. Lorsque les fonctions malloc et free sont activées, je dois entrer dans la fonction (étape) et collecter quelques informations de base comme l'adresse et la taille (en gros, imprimer ces valeurs). Une fois que c'est fait, je reprends mon programme.

Avons-nous un bon moyen de le faire ?

80voto

Fredrik Pihl Points 20944

Par exemple, voici comment vous pourriez utiliser les commandes de point d'arrêt pour imprimer la valeur de x à l'entrée de foo chaque fois que x est positif.

break foo if x>0
commands
silent
printf "x is %d\n",x
cont
end

Si la première commande que vous spécifiez dans une liste de commandes est silent le message habituel concernant l'arrêt à un point d'arrêt n'est pas imprimé. Cela peut être souhaitable pour les points d'arrêt qui doivent afficher un message spécifique et continuer ensuite. Si aucune des commandes restantes n'imprime quoi que ce soit, rien n'indique que le point d'arrêt a été atteint. silent n'a de sens qu'au début d'une liste de commandes de point d'arrêt.

L'une des applications des commandes de points d'arrêt consiste à compenser un bogue pour pouvoir en tester un autre. Placez un point d'arrêt juste après la ligne de code erronée, donnez-lui une condition pour détecter le cas dans lequel quelque chose d'erroné a été fait, et donnez-lui des commandes pour assigner des valeurs correctes à toutes les variables qui en ont besoin. Terminez par la commande continue pour que votre programme ne s'arrête pas, et commencez par la commande silent pour qu'aucune sortie ne soit produite. Voici un exemple :

break 403
commands
silent
set x = y + 4
cont
end

63voto

Ben Points 635

Pour clarifier la réponse de Fredrik, commands (ou simplement command semble) sait automatiquement que vous venez de placer un point d'arrêt. En d'autres termes, ce que Fredrik montre n'est pas un texte de plusieurs lignes. break il s'agit de deux commandes distinctes : break y commands . Il se présente comme suit :

(gdb) break 989 
Breakpoint 23 at 0x7fffe2761dac: file foo.cpp, line 989.
(gdb) command
Type commands for breakpoint(s) 23, one per line.
End with a line saying just "end".
>silent
>print result
>end
(gdb) c
Continuing.
$79 = {elems = {0, 0}}
(gdb)

1 votes

Commande vs commandes : GCC vous permet d'écrire uniquement le préfixe de commande, à condition qu'il soit unique. Aussi, pour les autres : "help commands" montre que l'on peut spécifier le point d'arrêt sur lequel fixer la condition.

16voto

Ciro Santilli Points 3341

dprintf (Dynamique printf )

https://sourceware.org/gdb/onlinedocs/gdb/Dynamic-Printf.html

C'est la solution la plus pratique pour le cas spécifique de l'impression de documents :

dprintf <line>, "%u\n", variable

Il pourrait également être plus rapide que commands car il pouvait compiler et injecter du code, au lieu de laisser le contrôle à GDB pour interpréter des chaînes de commande arbitraires, ce qui est extrêmement lent. TODO Je ne sais pas si c'est déjà fait. dprintf vs commands : Quelle est la différence entre dprintf et break + commande + continue ?

Exemple détaillé :

main.c

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    uint32_t i;
    uint32_t r = 0;
    for (i = 0; i < 10; ++i) {
        r += i*i + 13*r*i + 17;   /* LINE 10. */
    }
    printf("%" PRIu32 "\n", r);
    return EXIT_SUCCESS;
}

Ensuite :

gcc -ggdb3 -O0 -std=c99 -o main main.c
gdb -batch --nh -q -ex 'dprintf 10, "%u %u\n", i, r' -ex 'run' ./main

Output:

Dprintf 1 at 0x400545: file main.c, line 10.
0 0
1 17
2 256
3 6933
4 277346
5 14699371
6 970158528
7 3628079733
8 3070853710
9 317092431
3057168588
[Inferior 1 (process 14305) exited normally]

Testé sous Ubuntu 16.04, GDB 8.2.

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