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?

È stato utile?

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:

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top