Ich betreibe ein Programm mit einer sepecific Bibliothek LD_PRELOADing. So was.Wie gdb verwenden, um mit LD_PRELOAD
LD_PRELOAD=./my.so ./my_program
Wie führe ich dieses Programm mit GDB?
Ich betreibe ein Programm mit einer sepecific Bibliothek LD_PRELOADing. So was.Wie gdb verwenden, um mit LD_PRELOAD
LD_PRELOAD=./my.so ./my_program
Wie führe ich dieses Programm mit GDB?
folgendes tun.
(gdb) show environment LD_PRELOAD
Im seltenen Fall:
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
Sie können es die gleiche Art und Weise im Grunde tun, fügen Sie einfach gdb
vor dem Programmnamen: mit
LD_PRELOAD=./my.so gdb ./my.program
Sie können die Umgebungsvariablen überprüfen Sie müssen es tatsächlich in gdb ändern, z wenn ein dlopen()
Debuggen, ca Sie das tun:
(gdb) set environment LD_PRELOAD ./my.so
Oh, warten Sie, es nicht mit GDB 7.6.2 für mich arbeiten! Die Bibliothek wird nicht geladen, das heißt, dass keine der Antworten vollständig korrekt ist, zumindest nicht mit den aktuellen Tools.
Ich vermute, dass der Effekt des Preloads für GDB selbst unerwünscht ist (vielleicht ist es eine spöttische Bibliothek, die 'open()' und dergleichen modifiziert - wie 'fakeroot' usw.). –
Posting, weil wir in einem Fall lief, wo set environment
funktionierte nicht:
Von GDB documentation:
set exec-wrapper wrapper show exec-wrapper unset exec-wrapper
Wenn 'exec-Wrapper' gesetzt ist, wird der angegebene Wrapper Start verwendet wird, Programme zum Debuggen. gdb startet Ihr Programm mit einem Shell-Kommando des Formular-Exec-Wrapper-Programms. Quoting wird dem Programm und seinen Argumenten hinzugefügt, nicht jedoch dem Wrapper. Daher sollten Sie für Ihre Shell Anführungszeichen hinzufügen. Der Wrapper wird ausgeführt, bis er Ihr Programm ausführt, und dann übernimmt gdb die Kontrolle.
Sie können ein beliebiges Programm verwenden, das schließlich execve mit seinen Argumenten als Wrapper aufruft. Einige Standard-Unix-Dienstprogramme tun dies, z.B. env und nohup. Jedes Unix-Shell-Skript, das mit exec "$ @" endet, funktioniert ebenfalls.
Zum Beispiel können Sie env verwenden, um eine Umgebungsvariable auf das debuggt Programm zu übergeben, ohne dass die variable Einstellung in Ihrem Shell-Umgebung:
(gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' (gdb) run
Hier ist ein Weg, um alles zu laufen (mit Argumente und Umgebung) als ein Befehl:
Beispiel:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
Der scharfe Beobachter wird feststellen, dass env
hier als exec-Wrapper (wie Alexey Romanov Antwort) dient.
Sie können env
als exec-Wrapper auf der Kommandozeile mit der -iex
Flagge liefern:
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
diese Version funktionierte gut, wo einige andere Antworten nicht funktionierten oder wo nicht einfach zu verwenden. – Guillaume
http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - alles da drin hilft? – Mat