Mehrere Befehle in gdb, getrennt durch ein Trennzeichen ';'?

144

Ich versuche, zwei Befehle gleichzeitig in gdb auszuführen:

finish; next

Ich habe versucht, das ';' um die befehle zu trennen, aber gdb ließ mich nicht beides gleichzeitig machen.

Ist es möglich, mehrere Befehle in gdb auszuführen, ähnlich den durch ';' getrennten Bash-Befehlen? Trennzeichen?

Trevor Boyd Smith
quelle

Antworten:

179

Ich glaube nicht (aber ich kann mich irren). Sie können so etwas tun:

(gdb) definiere fn
> beenden
> weiter
> Ende

Und dann tippe einfach:

(gdb) fn

Sie können dies auch in Ihre ~/.gdbinitDatei einfügen, damit es immer verfügbar ist.

Sean Bright
quelle
1
Schlechte Methode, wenn gdb aufgerufen wird, nur um die Stapelverfolgung des Aufrufers zu drucken: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...und ich kann die Paginierung nicht deaktivieren.
Vi.
4
Und wenn Sie vergessen, wie Sie eine Funktion definiert haben, können Sie show user <function name>deren Quelle anzeigen, z show user fn.
Ntc2
44

Wenn Sie gdb über die Befehlszeile ausführen, können Sie mehrere Befehle mit dem Parameter -ex übergeben, z.

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

Dies in Verbindung mit Anzeige- und anderen Befehlen macht das Ausführen von gdb weniger umständlich.

Alecco
quelle
10

GDB hat kein solches Befehlstrennzeichen. Ich habe kurz nachgesehen, falls es einfach sein sollte, einen hinzuzufügen, aber leider nein ....

Michael Snyder
quelle
5

Sie können dies mithilfe der Python-Integration in tun gdb.

Es wäre schön, wenn man s ; bteinen Schritt zurücktreten und dann drucken würde, aber das tut es nicht.

Sie können dasselbe erreichen, indem Sie den Python-Interpreter aufrufen.

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

Es ist möglich, dies in einen dedizierten Befehl zu packen, der hier "cmds" genannt wird und von einer Python-Definition unterstützt wird.

Hier ist ein Beispiel, das .gdbinitum eine Funktion zum Ausführen mehrerer Befehle erweitert wurde.

# 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

Beispielaufruf:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye
Gregory Nisbet
quelle
Genial, da es ermöglicht, Befehle aus der Zwischenablage einzufügen und auszuführen.
Jean-François Fabre
0

Ich bin auf eine andere Möglichkeit gestoßen, mehrere Befehle in GDB mithilfe eines Bash HERE-Dokuments auszuführen.

Beispiel:

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

Dies hat eine begrenzte Wert- / Benutzerfreundlichkeit IMO, da GDB nach Ausführung der Befehlsliste beendet wird.

Trevor Boyd Smith
quelle