2012-05-04 10 views
35

Eseguo un programma con LD_PRELOADing una libreria specifica. Come questo.Come utilizzare gdb con LD_PRELOAD

LD_PRELOAD=./my.so ./my_program 

Come si esegue questo programma con gdb?

+1

http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload: tutto ciò che c'è in aiuto? – Mat

risposta

52

Effettuare quanto segue.

gdb your_program 

(gdb) set environment LD_PRELOAD ./yourso.so 
(gdb) start 
0

Si può sostanzialmente fare allo stesso modo, è sufficiente aggiungere gdb prima del nome del programma:

LD_PRELOAD=./my.so gdb ./my.program 

È possibile controllare le variabili di ambiente utilizzando:

(gdb) show environment LD_PRELOAD 

Nel raro caso in realtà devi cambiarlo all'interno di gdb, ad es quando il debug di un dlopen(), si ca farlo:

(gdb) set environment LD_PRELOAD ./my.so 

Oh, aspetta, non funziona per me con gdb 7.6.2! La libreria non viene caricata, ciò significa che nessuna delle risposte qui è completamente corretta, almeno con gli strumenti attuali.

+0

Suppongo che l'effetto del precaricamento non sia voluto per GDB stesso (forse è una libreria di derisione che modifica 'open()' e simili - come 'fakeroot' ecc.). –

5

distacco perché ci siamo imbattuti in un caso in cui set environment non ha funzionato:

Da GDB documentation:

set exec-wrapper wrapper 
show exec-wrapper 
unset exec-wrapper 

Quando 'exec-wrapper' è impostato, l'involucro specificato viene utilizzato per il lancio programmi per il debug. gdb avvia il tuo programma con un comando shell del programma wrapper exec del form. La citazione viene aggiunta al programma e ai suoi argomenti, ma non al wrapper, quindi è necessario aggiungere delle virgolette se appropriate per la propria shell. Il wrapper viene eseguito fino all'esecuzione del programma, quindi gdb assume il controllo.

È possibile utilizzare qualsiasi programma che alla fine richiama execve con i suoi argomenti come wrapper. Diverse utility Unix standard fanno questo, ad es. env e nohup. Funzionerà anche qualsiasi script di shell Unix che termina con exec "$ @".

Ad esempio, è possibile utilizzare ENV per passare una variabile di ambiente per il programma di debug, senza impostare la variabile nell'ambiente shell:

  (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' 
     (gdb) run 
4

Ecco un modo per eseguire tutto (con argomenti e ambiente) come un comando:

Esempio:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l 

L'osservatore attento noterà che env serve qui come un wrapper exec (come la risposta di Alexey Romanov).

1

È possibile fornire env come un exec-wrapper sulla riga di comando utilizzando il flag -iex:

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program 
+0

questa versione ha funzionato bene dove alcune altre risposte non hanno funzionato o dove non è facile da usare. – Guillaume