Come si avvia nuovamente l'esecuzione del programma in gdb con 'target remote'?
Domanda
Quando stai eseguendo una normale sessione gdb su un file eseguibile sullo stesso computer, puoi dare il comando run e il programma verrà riavviato da capo.
Quando esegui gdb su un sistema embedded, come con il comando target localhost:3210', come puoi riavviare il programma senza uscire e riavviare la sessione gdb?
Soluzione
Stai cercando Modalità multiprocesso per gdbserver E set remote exec-file filename
Altri suggerimenti
Sfortunatamente, non conosco un modo per riavviare l'applicazione e mantenere comunque la sessione.Una soluzione alternativa consiste nel riportare il PC al punto di ingresso del programma.Puoi farlo chiamando:
jump funzione
O
set $pc=indirizzo
.
Se hai sminuzzato gli argomenti main
potrebbe essere necessario configurarli di nuovo.
Modificare:
Ci sono un paio di avvertenze con il metodo sopra che potrebbero causare problemi.
- Se ti trovi in un programma multi-thread, il passaggio a main farà passare il thread corrente a main, tutti gli altri thread rimarranno.Se il thread corrente ha un blocco... allora hai dei problemi.
- Perdite di memoria, se il flusso del programma alloca alcune cose durante l'inizializzazione, hai appena perso un po' di memoria con il salto.
- I file aperti rimarranno comunque aperti.Se si mappano alcuni file o un indirizzo, molto probabilmente la chiamata fallirà.
Quindi, usare jump non è la stessa cosa che riavviare il programma.
Presumibilmente stai eseguendo gdbserver sul sistema incorporato.
Puoi chiedergli di riavviare il programma invece di uscire con destinazione estesa-remota
"jump_start" è il solito modo.
Per me il metodo descritto in 21.2 Esempio di avvio di una sessione GDB funziona alla grande.Quando entro monitor reset halt
successivamente, al prompt "(gdb)", l'hardware di destinazione viene ripristinato e posso riavviare l'applicazione con c
(= continua).
IL load
il comando può essere omesso tra le esecuzioni perché non è necessario eseguire il flashing del programma ancora e ancora.
Procedura passo dopo passo
A distanza:
# pwd contains cross-compiled ./myexec
gdbserver --multi :1234
Locale:
# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
-ex 'set remote exec-file ./myexec' \
--args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit
Testato su Ubuntu 14.04.
È anche possibile passare argomenti CLI al programma come:
gdbserver --multi :1234 ./myexec arg1 arg2
e il ./myexec
parte elimina la necessità di set remote exec-file ./myexec
, ma questo presenta i seguenti fastidi:
- non documentato: https://sourceware.org/bugzilla/show_bug.cgi?id=21981
- non viene visualizzato
show args
e non persiste tra i riavvii: https://sourceware.org/bugzilla/show_bug.cgi?id=21980
Passa variabili di ambiente e modifica la directory di lavoro senza riavviare: Come modificare le variabili di ambiente e la directory di lavoro di gdbserver --multi senza riavviarlo?
Se stai utilizzando gdb normale puoi digitare 'esegui' la scorciatoia 'r' e gdb ti chiederà se desideri riavviare il programma
Su EFM32 Happy Gecko nessuno dei suggerimenti funzionerebbe per me, quindi ecco cosa ho imparato dalla documentazione sull'integrazione di GDB nell'ambiente Eclipse.
(gdb) mon reset 0
(gdb) continue
(gdb) continue
Questo mi mette nello stato che mi sarei aspettato quando avessi premuto il reset dall'IDE.