Domanda

La mia domanda riguarda il debug remoto di un'applicazione su un processore Arm incorporato utilizzando gdb/gdbserver.

Posso eseguire il debug dell'applicazione stessa, ma l'applicazione si collega dinamicamente a una libreria condivisa che implementa un protocollo di comunicazione interno.Voglio essere in grado di impostare punti di interruzione all'interno delle funzioni della libreria condivisa, quindi prova a capire alcuni problemi di rilevamento del dispositivo.

Mi sono assicurato che la libreria sia compilata con simboli di debug e caricata da gdb sul lato host, posso elencare le funzioni all'interno della libreria e anche impostare i breakpoint ma non appena provo a eseguire l'applicazione ricevo un messaggio di errore su l'effetto di:

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

dove X è il numero del punto di interruzione in gdb ed è un indirizzo troppo piccolo per essere valido.
Sto utilizzando la nuova libreria sia sul computer di destinazione che su quello host, ma tramite mount -o bind newlib oldlib sul bersaglio da un supporto nfs.
Qualcuno ha un'idea su cosa potrebbe essere sbagliato?Grazie in anticipo.

È stato utile?

Soluzione

indovinare:. È stata caricata la libreria condivisa in GDB ospite presso l'indirizzo errato

Invece di caricare in modo esplicito in GDB, uso "set stop-on-solib-event on", attendere che la libreria per avere caricato (info shared vi dirà elenco corrente di librerie caricate), e poi impostare i punti di interruzione.

Altri suggerimenti

Vedo questa domanda è a partire dal 2009, ma le risposte attuali sono out-of-date, quindi ecco un aggiornamento:

@Employed russo ha suggerito che è necessario utilizzare stop-on-solib-event. Questo non è più vero; NDK r8d supporta i punti di interruzione in sospeso in solibs ancora-a-essere-caricati.

@ Brent Piddy dice che stop-on-solib-event non funziona con gdbserver. Questo è anche più vero dal momento che almeno R8C. La mia azienda ha un prodotto che si basa su questo comportamento NDK da GDB, saremmo in grossi guai senza di esso.

Utilizzare il comando seguente per impostare punti di interruzione in sospeso che verranno risolti dopo il caricamento della libreria di oggetti condivisi

set breakpoint pending on

Purtroppo non è possibile utilizzare "set stop-on-solib-event on" per il debug remoto di gdbserver poiché gdbserver non riconosce/invia eventi solib.Ho dovuto semplicemente emettere un comando set solib-search-path o set sysroot per fare in modo che gdb caricasse tutti i simboli della libreria condivisa dopo aver raggiunto un punto di interruzione su main.

Esegui fino a main e poi set solib-search-path .

Altrimenti, gdbserver ferma al caricatore dinamico, prima delle librerie vengono caricate. A main, dovrebbero essere pronti per GDB.

Più informazioni: debug di librerie condivise con gdbserver

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