Vários comandos no gdb separados por algum tipo de delimitador ';'?

144

Estou tentando executar dois comandos ao mesmo tempo no gdb:

finish; next

Eu tentei usar o ';' para separar os comandos, mas o gdb não me deixou fazer as duas coisas ao mesmo tempo.

É possível executar vários comandos no gdb semelhantes aos comandos bash separados por ';' delimitador?

Trevor Boyd Smith
fonte

Respostas:

179

Eu não acredito nisso (mas posso estar errado). Você pode fazer algo assim:

(gdb) define fn
> terminar
> próximo
> fim

E então digite:

(gdb) fn

Você também pode colocar isso em seu ~/.gdbinitarquivo, para que esteja sempre disponível.

Sean Bright
fonte
1
Método ruim quando o gdb é chamado apenas para imprimir o rastreamento de pilha do invocador: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...e não consigo desativar a paginação.
Vi.
4
E se você esquecer como definiu uma função, poderá usar show user <function name>para ver sua fonte, por exemplo show user fn.
Ntc2
44

Se você estiver executando o gdb na linha de comando, poderá passar vários comandos com o parâmetro -ex como:

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

Isso, juntamente com a exibição e outros comandos, torna a execução do gdb menos complicada.

alecco
fonte
10

O GDB não possui esse caractere separador de comandos. Olhei brevemente, caso fosse fácil adicionar um, mas infelizmente não ....

Michael Snyder
fonte
5

Você pode fazer isso usando a integração python no gdb.

Seria bom se s ; btpisado e depois impresso um backtrace, mas não o faz.

Você pode realizar a mesma coisa chamando o intérprete Python.

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

É possível agrupar isso em um comando dedicado, aqui chamado "cmds", apoiado por uma definição de python.

Aqui está um exemplo .gdbinitestendido com uma função para executar vários comandos.

# 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

exemplo de invocação:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye
Gregory Nisbet
fonte
brilhante, pois permite colar o comando da área de transferência e executá-lo.
Jean-François Fabre
0

Corri para outra maneira de executar vários comandos no GDB usando um documento do Bash HERE.

exemplo:

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

isso tem IMO de valor / usabilidade limitado porque o GDB é encerrado após a execução da lista de comandos.

Trevor Boyd Smith
fonte