web-dev-qa-db-fra.com

Plusieurs commandes 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 à la fois.

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

131
Trevor Boyd Smith

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

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

Et puis tapez simplement:

 (gdb) fn 

Vous pouvez mettre cela dans votre ~/.gdbinit également, il est donc toujours disponible.

163
Sean Bright

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, couplé à l'affichage et à d'autres commandes, rend l'exécution de gdb moins lourde.

38
alecco

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

9
Michael Snyder

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

Ce serait bien si s ; bt Faisait un pas puis imprimait une trace, 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'appel:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye
5
Gregory Nisbet

j'ai couru d'une autre manière pour faire plusieurs commandes dans GDB en utilisant un document Bash ICI.

exemple:

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

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

0
Trevor Boyd Smith