Кілька команд в gdb, розділених деяким роздільником ';'?


144

Я намагаюся виконати дві команди одночасно в 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 менш громіздкою.


10

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


5

Це можна зробити за допомогою інтеграції python в gdb.

Було б добре, якби s ; btступив і потім надрукував backtrace, але це не так.

Ви можете зробити те саме, зателефонувавши до інтерпретатора 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 закриває після виконання списку команд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.