Comandi multipli in gdb separati da una sorta di delimitatore ';'?


145

Sto cercando di eseguire due comandi contemporaneamente in gdb:

finish; next

Ho provato a usare il ';' per separare i comandi ma gdb non mi ha permesso di fare entrambe le cose contemporaneamente.

È possibile eseguire più comandi in gdb in modo simile ai comandi bash separati da ';' delimitatore?

Risposte:


179

Non ci credo (ma potrei sbagliarmi). Puoi fare qualcosa del genere:

(gdb) definisce fn
> finitura
> successivo
> fine

E poi basta digitare:

(gdb) fn

Puoi inserirlo anche nel tuo ~/.gdbinitfile in modo che sia sempre disponibile.


1
Metodo errato quando viene invocato gdb solo per stampare stacktrace dell'invocatore: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...e non riesco a disattivare l'impaginazione.
Vi.

4
E se dimentichi come hai definito una funzione, puoi usarla show user <function name>per vederne l'origine, ad es show user fn.
ntc2,

44

Se stai eseguendo gdb dalla riga di comando puoi passare più comandi con il parametro -ex come:

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

Questo accoppiato con display e altri comandi rende l'esecuzione di gdb meno complicata.


10

GDB non ha un tale carattere di separazione dei comandi. Ho guardato brevemente, nel caso fosse facile aggiungerne uno, ma sfortunatamente no ...


5

Puoi farlo usando l'integrazione di Python in gdb.

Sarebbe bello se facesse un s ; btpasso e poi stampasse una backtrace, ma non lo fa.

Puoi ottenere lo stesso risultato chiamando l'interprete Python.

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

È possibile racchiuderlo in un comando dedicato, qui chiamato "cmds", supportato da una definizione di Python.

Ecco un esempio .gdbinitesteso con una funzione per eseguire più comandi.

# 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

esempio di invocazione:

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

geniale, in quanto consente di incollare il comando dagli appunti ed eseguirlo.
Jean-François Fabre

0

mi sono imbattuto in un altro modo per eseguire più comandi in GDB usando un documento Bash HERE.

esempio:

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

questo ha un valore / usabilità IMO limitato perché GDB si chiude dopo aver eseguito l'elenco dei comandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.