157 votes

Commandes multiples dans gdb séparées par une sorte de délimiteur ';' ?

J'essaie d'exécuter deux commandes à la fois dans gdb :

finish; next

J'ai essayé d'utiliser le ';' pour séparer les commandes mais gdb ne m'a pas laissé faire les deux en même temps.

Est-il possible d'effectuer des commandes multiples dans gdb de manière similaire aux commandes bash séparées par le délimiteur ';' ?

207voto

Sean Bright Points 39480

Je ne le crois pas (mais je peux me tromper). Vous pouvez faire quelque chose comme ceci :

(gdb) define fn
> finish
> next
> end

Et ensuite, tapez simplement :

(gdb) fn

Vous pouvez le mettre dans votre ~/.gdbinit afin qu'il soit toujours disponible.

2 votes

Mauvaise méthode lorsque gdb est invoqué juste pour imprimer la trace de la pile de l'invocateur : execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ... et je ne peux pas désactiver la pagination.

4 votes

Et si vous oubliez comment vous avez défini une fonction, vous pouvez utiliser show user <function name> pour voir sa source, par exemple show user fn .

55voto

alecco Points 1277

Si vous exécutez gdb depuis une ligne de commande, vous pouvez passer plusieurs commandes avec le paramètre -ex comme :

$ gdb ./prog -ex 'b srcfile.c:90' -ex 'b somefunc' -ex 'r -p arg1 -q arg2'

Ceci, couplé avec l'affichage et d'autres commandes, rend l'utilisation de gdb moins encombrante.

10voto

Michael Snyder Points 2457

GDB ne dispose pas d'un tel caractère de séparation des commandes. J'ai regardé brièvement, au cas où il serait facile d'en ajouter un, mais malheureusement non.....

9voto

Gregory Nisbet Points 2849

Vous pouvez le faire en utilisant l'intégration python dans gdb .

Ce serait bien si s ; bt et a ensuite imprimé un backtrace, mais ce n'est pas le cas.

Vous pouvez accomplir la même chose en faisant appel à l'interpréteur Python.

python import gdb ; print(gdb.execute("s")) ; print(gdb.execute("bt"))

Il est possible de regrouper tout cela dans une commande dédiée, appelée ici "cmds", soutenue par une définition python.

Voici un exemple .gdbinit étendu avec une fonction permettant d'exécuter des commandes multiples.

# multiple commands
python
from __future__ import print_function
import gdb

class Cmds(gdb.Command):
  """run multiple commands separated by ';'"""
  def __init__(self):
    gdb.Command.__init__(
      self,
      "cmds",
      gdb.COMMAND_DATA,
      gdb.COMPLETE_SYMBOL,
      True,
    )

  def invoke(self, arg, from_tty):
    for fragment in arg.split(';'):
      # from_tty is passed in from invoke.
      # These commands should be considered interactive if the command
      # that invoked them is interactive.
      # to_string is false. We just want to write the output of the commands, not capture it.
      gdb.execute(fragment, from_tty=from_tty, to_string=False)
      print()

Cmds()
end

exemple d'invocation :

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye

2voto

Vainstein K Points 66

C'est certainement possible. Étant donné, par exemple, le code C

int a = 3;
double b = 4.4;
short c = 555;

Supposons que nous voulions demander à GDB quel est le type de chacune de ces variables.  La séquence suivante de commandes GDB nous permettra d'entrer 3 whatis sur une seule ligne :

  1. set prompt #gdb#
    • Toute invite dont premier caractère non blanc est # fonctionnera : il se trouve que # démarre un commentaire dans les scripts de commande GDB.
  2. set logging overwrite on
    • Par défaut, GDB ajoute dans un fichier journal ; en choisissant plutôt écraser nous permettra de déployer facilement cette astuce à nouveau plus tard, avec des commandes différentes.
  3. set logging redirect on
    • Autrement dit, enregistrez la sortie des commandes tapées dans le fichier journal uniquement : ne l'affichez pas dans le terminal. (Ce n'est pas absolument nécessaire pour nos besoins, mais cela permet de limiter l'encombrement).
  4. set logging on
    • Cela permet à GDB de commencer à enregistrer les données ; par défaut, le fichier d'enregistrement s'appelle gdb.txt .
  5. printf "\nwhatis a\nwhatis b\nwhatis c\n"
    • Nos 3 whatis demandes, saisie sur une seule ligne comme promis !  Séparer les commandes, avant la première, et après la dernière, c'est \n .
  6. set logging off
    • Fini d'écrire à gdb.txt ce fichier contient maintenant une commande GDB valide script :
   #gdb#
   whatis a
   whatis b
   whatis c
   #gdb#
  1. source gdb.txt

    • GDB exécute maintenant les commandes dans le script qu'il vient de générer, produisant les résultats attendus :

    type = int type = double type = short


Notes

  • Si vous souhaitez déployer à nouveau cette astuce dans la même session GDB, il suffit de réaliser les étapes 4 à 7.
  • Génération d'une commande script avec shell serait moins contraignante, et pourrait bien être possible ; la méthode ci-dessus, cependant, est indépendante de la plate-forme.

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