Come eseguire automaticamente l'eseguibile in GDB?


91

Vorrei aver gdbeseguito immediatamente l'eseguibile, come se avessi digitato "run" (motivazione: non mi piace digitare "run").

Un modo è quello di inviare il comando gdbin questo modo:

$ echo run | gdb myApp

Ma il problema con questo approccio è che perdi interattività con gdb, ad es. se un punto di interruzione si attiva o si myAppblocca, si gdbchiude. Questo metodo è discusso qui .

Guardando le opzioni in --help, non vedo un modo per farlo, ma forse mi manca qualcosa.

Risposte:


127
gdb -ex run ./a.out

Se devi passare argomenti a a.out:

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

EDIT: Orion dice che questo non funziona su Mac OSX.

Il -exflag è disponibile da allora GDB-6.4(rilasciato nel 2005), ma OSX utilizza il fork di GDB di Apple e contiene l'ultimo XCode per Leopard GDB 6.3.50-20050815 (Apple version gdb-967), quindi sei sfortunato.

Edificio attuale GDB-7.0.1release è una possibile soluzione. Assicurati solo di leggere questo .


1
Grazie per la risposta. quella riga si comporta come solo "gdb ./a.out" per me comunque.
orion elenzil

3
Ho appena confermato che puoi anche passare più opzioni -ex sulla riga di comando e verranno eseguite in ordine prima di trasferire l'input gdb a te.
Tung Nguyen

Questa soluzione non funziona se il programma ha argomenti come:./a.out a b
gigilibala

poiché OSX / xcode non supporta più gdb fuori dalla scatola (lldb è il nuovo gdb), questo ora sembra l'approccio migliore.
orion elenzil

Ho creato un file di comando e lo uso gdb -xsu sistemi Linux. OS X utilizza LLVM e clang, quindi controlla le funzionalità di debug di lldb.
Daisuke Aramaki

22

Userei uno script gdb:

gdb -x your-script

dove il tuo script contiene qualcosa come:

file a.out
b main
r

in seguito hai il normale prompt interattivo di gdb

MODIFICARE :

ecco un'ottimizzazione per i veramente pigri:

  1. salva lo script come .gdbinitinworking directory .
  2. Successivamente esegui semplicemente gdb come

    gdb

... e gdb carica ed esegue automaticamente il contenuto di .gdbinit.


hey grazie per la risposta. sembra proprio quello che voglio tranne che non ricevo il prompt di gdb, ottengo la sospensione di gdb e sono tornato alla riga di comando come se avessi digitato "ctrl-z". se i "fg", gdb riprende e l'app viene eseguita. questo è OS X.
orion elenzil

orion: mmmh - è sorprendente per me. Funziona bene con ogni tipo di UNIX che sto utilizzando (Linux, Solaris, AIX). Quale versione di gdb stai usando?

Ho appena verificato nuovamente il comportamento di questo - mi esce ancora dalla riga di comando con gdb sospeso. GNU gdb 6.3.50-20050815 (versione Apple gdb-1518) (sabato 12 febbraio 02:52:12 UTC 2011).
orion elenzil

@orionelenzil Non ho idea del perché, ma se metti fgdopo la rriga, agisce in modo
corretto


20
(echo r ; cat) | gdb a.out

Il gatto ti permette di continuare a digitare dopo le interruzioni di gdb.


whoa, fantastico. devi ctrl-c dopo essere uscito da gdb per fermare il gatto, ma è fantastico.
orion elenzil

3
Sembra che tu perda alcuni controlli chiave sull'istanza gdb usando questo.
Treviño

Inoltre, domande come Make breakpoint pending on future shared library load? (y or [n])assumeranno automaticamente la risposta "No".
Ruslan

6

start comando

Questo comando è un'altra buona opzione:

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

È come correre, ma imposta anche un punto di interruzione temporaneo maine si ferma lì.

Questo punto di interruzione temporaneo viene disattivato una volta raggiunto.

starti

C'è anche una correlazione startiche avvia il programma e si ferma invece alla prima istruzione, vedi anche: Arresto alla prima istruzione del codice macchina in GDB

Ottimo quando stai facendo cose di basso livello.


4

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.