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?

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.


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.


10

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


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

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ń.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.