Несколько команд в GDB разделены каким-то разделителем ';'? - PullRequest
128 голосов
/ 12 августа 2009

Я пытаюсь выполнить две команды одновременно в GDB:

finish; next

Я пытался использовать ';' разделить команды, но GDB не позволил мне сделать оба сразу.

Можно ли выполнять несколько команд в gdb, аналогично командам bash, разделенным ';' Разделитель

Ответы [ 5 ]

162 голосов
/ 12 августа 2009

Не верю (но могу ошибаться). Вы можете сделать что-то вроде этого:

(gdb) define fn
> finish
> next
> end

А затем просто наберите:

(gdb) fn

Вы также можете поместить это в файл ~/.gdbinit, чтобы он всегда был доступен.

37 голосов
/ 07 февраля 2013

Если вы запускаете gdb из командной строки, вы можете передавать несколько команд с параметром -ex, например:

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

Это в сочетании с отображением и другими командами делает запуск GDB менее громоздким.

8 голосов
/ 28 октября 2009

GDB не имеет такого символа-разделителя команд. Я посмотрел кратко, на случай, если это будет легко добавить, но, к сожалению, нет ....

5 голосов
/ 12 августа 2018

Вы можете сделать это, используя интеграцию с Python в gdb.

Было бы неплохо, если бы s ; bt шагнул и затем напечатал обратную трассировку, но это не так.

Вы можете сделать то же самое, вызвав интерпретатор Python.

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

Можно заключить это в специальную команду, называемую здесь "cmds", подкрепленную определением python.

Вот пример .gdbinit, расширенный функцией для запуска нескольких команд.

# 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

пример вызова:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye
0 голосов
/ 13 марта 2018

я столкнулся с другим способом для выполнения нескольких команд в GDB с использованием документа Bash HERE.

пример:

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

это имеет ограниченную ценность / удобство использования IMO, потому что GDB завершает работу после выполнения списка команд.

...