Wiele poleceń w gdb oddzielonych jakimś separatorem „;”?

144

Próbuję wykonać dwie komendy naraz w gdb:

finish; next

Próbowałem użyć ';' oddzielić polecenia, ale gdb nie pozwolił mi zrobić obu naraz.

Czy jest możliwe wykonanie wielu poleceń w gdb podobnych do poleceń bash oddzielonych znakiem „;” separator?

Trevor Boyd Smith
źródło

Odpowiedzi:

179

Nie wierzę (ale mogę się mylić). Możesz zrobić coś takiego:

(gdb) zdefiniuj fn
> koniec
> dalej
> koniec

A potem po prostu wpisz:

(gdb) fn

Możesz również umieścić to w swoim ~/.gdbinitpliku, aby było zawsze dostępne.

Sean Bright
źródło
1
Zła metoda, gdy gdb jest wywoływany tylko w celu wydrukowania stosu wywołującego: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...i nie mogę wyłączyć stronicowania.
Vi.
4
A jeśli zapomnisz, jak zdefiniowałeś funkcję, możesz użyć show user <function name>do wyświetlenia jej źródła, np show user fn.
ntc2
44

Jeśli uruchamiasz gdb z wiersza poleceń, możesz przekazać wiele poleceń z parametrem -ex, na przykład:

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

To w połączeniu z wyświetlaniem i innymi poleceniami sprawia, że ​​uruchamianie gdb jest mniej kłopotliwe.

alecco
źródło
10

GDB nie ma takiego znaku separatora poleceń. Rozejrzałem się krótko, na wypadek, gdyby łatwo było dodać, ale niestety nie ....

Michael Snyder
źródło
5

Możesz to zrobić za pomocą integracji Pythona w gdb.

Byłoby miło, gdybyśmy s ; btprzeszli, a następnie wydrukowali ślad, ale tak nie jest.

Możesz osiągnąć to samo, wywołując interpreter języka Python.

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

Możliwe jest zawinięcie tego w dedykowane polecenie, tutaj zwane „cmds”, wspierane przez definicję Pythona.

Oto przykład .gdbinitrozszerzony o funkcję do uruchamiania wielu poleceń.

# 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

przykładowe wywołanie:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye
Gregory Nisbet
źródło
genialne, bo pozwala wkleić polecenie ze schowka i wykonać je.
Jean-François Fabre
0

natrafiłem na inny sposób wykonywania wielu poleceń w GDB przy użyciu dokumentu Bash HERE.

przykład:

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

ma to ograniczoną wartość / użyteczność IMO, ponieważ GDB kończy pracę po wykonaniu listy poleceń.

Trevor Boyd Smith
źródło