2010-04-15 4 views
9

Ho una libreria condivisa libtest.so che verrà caricata nel programma principale usando dlopen. La funzione test() risiede nel libtest.so e verrà richiamata nel programma principale tramite dlsym. C'è un modo per impostare un punto di rottura su test?come impostare il breakpoint sulla funzione in una libreria condivisa che non è stata caricata in gdb

Si prega di notare che il programma principale non è stato collegato a libtest.so durante il tempo di collegamento. In caso contrario, dovrei essere in grado di impostare il punto di interruzione anche se si tratta di un'azione in sospeso. Nel mio caso, quando faccio b test, gdb mi dirà Function "test" not defined.

+0

Potresti impostare un punto di interruzione 'test' dopo il caricamento' libtest.so' con 'dlopen'? –

risposta

11

realtà gdb dovrebbe dirvi che è in grado di risolvere il simbolo in futuro, quando le nuove librerie vengono caricate:

(gdb) b test 
Function "test" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (test) pending. 
(gdb) r 

E più tardi una volta che l'oggetto .so viene caricato, si risolverà il punto di interruzione, es .:

Reading symbols for shared libraries . done 
Breakpoint 1 at 0xcafebebe 
Pending breakpoint 1 - "test" resolved 
+0

Sul GDB che sto usando, anche se "settaggio breakpoint in sospeso" NON mi chiederà se voglio il comportamento in sospeso se il simbolo non è definito. Mi dice solo "Non riesci a trovare un membro bla bla Suggerimento prova tab bla bla" –

6

In realtà, questo metodo non funzionerà sempre.

Supponiamo di avere diverse librerie condivise che hanno ciascuna una funzione denominata "Init". Se ho caricato una libreria diversa, "b Init" sta per impostare il punto di interruzione sull'istanza errata della funzione "Init". Quindi devo specificare il punto di interruzione in questo modo:

(gdb) b object5.c: 66

Nessun file di origine denominato object5.c.

+0

Nel mio caso il problema che ho riscontrato è che devo compilare con i simboli di debug (per mettere i breakpoint in un file .so personalizzato). –

1

come impostare un punto di interruzione su una lib condivisa.

[E 'abbastanza comune per avere un punto di interruzione all'interno di una libreria condivisa. Le librerie condivise possono essere caricate e scaricate esplicitamente, e possibilmente ripetutamente, mentre il programma viene eseguito. Per supportare questo caso d'uso, gdb aggiorna le posizioni dei punti di interruzione ogni volta che una libreria condivisa viene caricata o scaricata. In genere, si imposta un punto di interruzione in una libreria condivisa all'inizio della sessione di debug, quando la libreria non viene caricata e quando i simboli della libreria non sono disponibili. Quando si tenta di impostare breakpoint, gdb vi chiederà se si desidera impostare un cosiddetto punto di interruzione-breakpoint in attesa il cui indirizzo non è ancora risolto.]

citazione da https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

(gdb) b object5.c: 66 Nessun file di origine denominato object5.c.

forse è possibile utilizzare "set the_location_of_object5.c_file directory" per risolvere il problema.

  • voce dell'Elenco
0

Un altro modo è quello di specificare la funzione nome del file e der, per es .:

b object5.c:test 

Questo dovrebbe essere univoco.Forse si vuole anche specificare il percorso del codice sorgente (come già suggerito) da:

set directories path_of_object5.c