Múltiples comandos en gdb separados por algún tipo de delimitador ';'?

145

Estoy tratando de ejecutar dos comandos a la vez en gdb:

finish; next

Intenté usar el ';' para separar los comandos pero gdb no me dejó hacer ambos a la vez.

¿Es posible hacer múltiples comandos en gdb similares a los comandos bash separados por ';' delimitador?

Trevor Boyd Smith
fuente

Respuestas:

179

No lo creo (pero puedo estar equivocado). Puedes hacer algo como esto:

(gdb) define fn
> terminar
> siguiente
> fin

Y luego solo escribe:

(gdb) fn

También puede poner esto en su ~/.gdbinitarchivo para que siempre esté disponible.

Sean Bright
fuente
1
Método mal cuando se invoca el BGF sólo para StackTrace impresión del invocador: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...y no puedo apagar la paginación.
Vi.
44
Y si olvida cómo definió una función, puede usarla show user <function name>para ver su fuente, por ejemplo show user fn.
ntc2
44

Si está ejecutando gdb desde la línea de comandos, puede pasar varios comandos con el parámetro -ex como:

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

Esto, junto con la pantalla y otros comandos, hace que ejecutar gdb sea menos engorroso.

alecco
fuente
10

GDB no tiene dicho carácter separador de comandos. Miré brevemente, en caso de que fuera fácil agregar uno, pero desafortunadamente no ...

Michael Snyder
fuente
5

Puede hacerlo utilizando la integración de Python en gdb.

Sería bueno si s ; btpisas y luego imprimes una traza inversa, pero no lo hace.

Puede lograr lo mismo llamando al intérprete de Python.

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

Es posible resumir esto en un comando dedicado, aquí llamado "cmds", respaldado por una definición de Python.

Aquí hay un ejemplo .gdbinitextendido con una función para ejecutar múltiples 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

invocación de ejemplo:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye
Gregory Nisbet
fuente
brillante, ya que permite pegar el comando desde el portapapeles y ejecutarlo.
Jean-François Fabre
0

Me encontré con otra forma de hacer múltiples comandos en GDB usando un documento Bash AQUÍ.

ejemplo:

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

esto tiene un valor limitado / usabilidad IMO porque GDB se cierra después de ejecutar la lista de comandos.

Trevor Boyd Smith
fuente