Несколько команд в GDB разделены каким-то разделителем ';'?

145

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

finish; next

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

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

Тревор Бойд Смит
источник

Ответы:

179

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

(GDB) определить FN
> закончить
> следующий
> конец

А затем просто введите:

(GDB) FN

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

Шон Брайт
источник
1
Плохой метод, когда GDB вызывается только для того, чтобы напечатать трассировку стека инвокера: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...и я не могу отключить нумерацию страниц.
Ви.
4
И если вы забудете, как вы определили функцию, вы можете использовать, show user <function name>чтобы увидеть ее источник, например show user fn.
ntc2
44

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

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

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

alecco
источник
10

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

Майкл Снайдер
источник
5

Вы можете сделать это, используя интеграцию с 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

я столкнулся с другим способом сделать несколько команд в GDB, используя документ Bash ЗДЕСЬ.

пример:

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

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

Тревор Бойд Смит
источник