¿Cómo ejecutar automáticamente el ejecutable en GDB?

92

Me gustaría haber gdbejecutado inmediatamente el ejecutable, como si hubiera escrito "ejecutar" (motivación: no me gusta escribir "ejecutar").

Una forma es canalizar el comando de gdbesta manera:

$ echo run | gdb myApp

Pero el problema con este enfoque es que pierde interactividad con gdb, por ejemplo. si un punto de interrupción se activa o myAppfalla, se gdbcierra. Este método se analiza aquí .

Mirando las opciones en --help, no veo una manera de hacer esto, pero tal vez me estoy perdiendo algo.

orion elenzil
fuente

Respuestas:

129
gdb -ex run ./a.out

Si necesita pasar argumentos a a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

EDITAR: Orion dice que esto no funciona en Mac OSX.

La -exbandera ha estado disponible desde GDB-6.4(lanzada en 2005), pero OSX usa la bifurcación de GDB de Apple y el último XCode para Leopard contiene GDB 6.3.50-20050815 (Apple version gdb-967), por lo que no tiene suerte.

La construcción de la GDB-7.0.1versión actual es una posible solución. Solo asegúrate de leer esto .

Ruso empleado
fuente
1
gracias por la respuesta. esa línea se comporta igual que "gdb ./a.out" para mí aunque.
orion elenzil
3
Acabo de confirmar que también puede pasar múltiples opciones -ex en la línea de comando y se ejecutarán en orden antes de transferirle la entrada gdb.
Tung Nguyen
Esta solución no funciona si el programa tiene argumentos como:./a.out a b
gigilibala
dado que OSX / xcode ya no es compatible con gdb de fábrica (lldb es el nuevo gdb), este parece ahora el mejor enfoque.
orion elenzil
Hice un archivo de comando y lo utilicé gdb -xen sistemas Linux. OS X usa LLVM y clang, así que compruebe las capacidades de depuración de lldb.
Daisuke Aramaki
23

Usaría un guión gdb:

gdb -x your-script

donde su-script contiene algo como:

file a.out
b main
r

luego tienes el indicador gdb interactivo normal

EDITAR :

aquí hay una optimización para los verdaderamente vagos:

  1. guarde el script como .gdbiniten working directory.
  2. Luego, simplemente ejecute gdb como

    gdb

... y gdb carga y ejecuta automáticamente el contenido de .gdbinit.


fuente
hola gracias por la respuesta. Eso se ve exactamente como lo que quiero, excepto que no obtengo el indicador de gdb, obtengo gdb suspendido y estoy de vuelta en la línea de comandos como si hubiera escrito "ctrl-z". si "fg", gdb se reanuda y la aplicación se ejecuta. esto es OS X.
orion elenzil
orion: mmmh - eso me sorprende. Funciona bien con todos los tipos de UNIX que estoy usando (Linux, Solaris, AIX). ¿Qué versión de gdb estás usando?
Acabo de volver a verificar el comportamiento de esto: todavía me sale a la línea de comandos con gdb suspendido. GNU gdb 6.3.50-20050815 (versión de Apple gdb-1518) (sábado 12 de febrero 02:52:12 UTC 2011).
orion elenzil
@orionelenzil Ni idea de por qué, pero si se pone fgdespués de la rlínea, que actúa con cordura
DBR
El startcomando proporciona un atajo para b+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
20
(echo r ; cat) | gdb a.out

El gato te permite seguir escribiendo después de que gdb se rompa.

cadabra
fuente
Whoa, impresionante. tienes que presionar ctrl-c después de salir de gdb para detener el gato, pero eso es genial.
orion elenzil
3
Parece que pierde algo de control de teclas en la instancia de gdb al usar esto.
Treviño
Además, preguntas como Make breakpoint pending on future shared library load? (y or [n])asumirán automáticamente la respuesta "No".
Ruslan
6

start mando

Este comando es otra buena opción:

gdb -ex start --args ./a.out arg1 arg2

Es como correr, pero también establece un punto de interrupción temporal mainy se detiene allí.

Este punto de interrupción temporal se desactiva una vez que se alcanza.

starti

También hay un relacionado startique inicia el programa y se detiene en la primera instrucción en su lugar, vea también: Parada en la primera instrucción de código de máquina en GDB

Genial cuando estás haciendo cosas de bajo nivel.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
4

gdb -x <(echo run) --args $program $args

metanfetamina
fuente