Plusieurs commandes dans gdb séparées par une sorte de délimiteur ';'?


145

J'essaye 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 à la fois.

Est-il possible de faire plusieurs commandes dans gdb similaires aux commandes bash séparées par ';' délimiteur?

Réponses:


179

Je ne le crois pas (mais je me trompe peut-être). Vous pouvez faire quelque chose comme ceci:

(gdb) définir fn
> terminer
> suivant
> fin

Et puis tapez simplement:

(gdb) fn

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


1
Mauvaise méthode lorsque gdb est appelé juste pour afficher le stacktrace de l'invocateur: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...et je ne peux pas désactiver la pagination.
Vi.

4
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.
ntc2

44

Si vous exécutez gdb à partir de la 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, associé à l'affichage et à d'autres commandes, rend l'exécution de gdb moins lourde.


10

GDB n'a pas de caractère séparateur de commande. J'ai regardé brièvement, au cas où il serait facile d'en ajouter un, mais malheureusement non ...


5

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

Ce serait bien de faire un s ; btpas et d'imprimer une trace arrière, mais ce n'est pas le cas.

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

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

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

Voici un exemple .gdbinitétendu avec une fonction pour exécuter plusieurs commandes.

# 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

brillant, car il permet de coller une commande à partir du presse-papiers et de l'exécuter.
Jean-François Fabre

0

J'ai rencontré une autre façon de faire plusieurs commandes dans GDB en utilisant un document Bash HERE.

exemple:

cat << EOF | gdb
print "command_1"
print "..."
print "command_n"
EOF

cela a une valeur / utilisabilité limitée IMO car GDB se ferme après l'exécution de la liste des commandes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.