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?
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?
Wykonaj następujące czynności.
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
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.
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.). –
Delegowanie ponieważ wpadliśmy w przypadku, gdy set environment
nie działa:
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
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).
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
ta wersja działała dobrze, gdy niektóre inne odpowiedzi nie działały lub nie były łatwe w użyciu. – Guillaume
http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - cokolwiek w tym pomoże? – Mat