2012-05-04 13 views
35

Uruchamiam program z LD_PRELOAD dla pojedynczej biblioteki. Lubię to.Jak korzystać z gdb z LD_PRELOAD

LD_PRELOAD=./my.so ./my_program 

Jak uruchomić ten program z gdb?

+1

http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - cokolwiek w tym pomoże? – Mat

Odpowiedz

52

Wykonaj następujące czynności.

gdb your_program 

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

można w zasadzie zrobić to w ten sam sposób, po prostu dodaj gdb przed nazwą programu:

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

można sprawdzić zmienne środowiskowe za pomocą:

(gdb) show environment LD_PRELOAD 

W rzadkich przypadkach musisz go zmienić wewnątrz gdb, np podczas debugowania dlopen(), ca to zrobić:

(gdb) set environment LD_PRELOAD ./my.so 

Oh, czekaj, to nie działa dla mnie z gdb 7.6.2! Biblioteka nie jest ładowana, co oznacza, że ​​żadna z odpowiedzi tutaj nie jest całkowicie poprawna, przynajmniej z obecnymi narzędziami.

+0

Zgaduję, że efekt wstępnego ładowania jest niepożądany dla samego GDB (być może jest to szydercza biblioteka, która modyfikuje 'open()' i podobne - takie jak 'fakeroot' itp.). –

5

Delegowanie ponieważ wpadliśmy w przypadku, gdy set environment nie działa:

Od GDB documentation:

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

Kiedy 'exec-wrapper' jest ustawiony, określony wrapper jest używany do uruchomienia programy do debugowania. gdb uruchamia twój program poleceniem powłoki programu wrappera exec. Cytowanie jest dodawane do programu i jego argumentów, ale nie do otoki, więc powinieneś dodać cytaty, jeśli są odpowiednie dla twojej powłoki. Opakowanie działa, dopóki nie wykona programu, a następnie gdb przejmie kontrolę.

Możesz użyć dowolnego programu, który ostatecznie wywołuje execve z jego argumentami jako wrapper. Wiele standardowych narzędzi Unix to robi, np. env i nohup. Dowolny skrypt powłoki uniksowej kończący się exec "$ @" również będzie działał.

Na przykład, można użyć env przekazać zmienną środowiskową do debugowanemu programu, bez ustawiania zmiennej w środowisku swojej powłoki:

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

Oto sposób, aby uruchomić wszystko (z argumenty i środowisko) jako jeden polecenia:

Przykład:

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

Sprytny obserwator zauważy, że env służy tutaj jako opakowanie exec (jak odpowiedź Alexeya Romanowa).

1

można dostarczać env jako exec-owijki na linii poleceń za pomocą -iex flag

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

ta wersja działała dobrze, gdy niektóre inne odpowiedzi nie działały lub nie były łatwe w użyciu. – Guillaume