2012-05-04 13 views
35

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?

+1

http://stackoverflow.com/questions/4703763/how-to-run-gdb-with- ld-preload - alles da drin hilft? – Mat

Antwort

52

folgendes tun.

(gdb) show environment LD_PRELOAD 

Im seltenen Fall:

gdb your_program 

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

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.

+0

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.). –

5

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 
4

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.

1

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 
+0

diese Version funktionierte gut, wo einige andere Antworten nicht funktionierten oder wo nicht einfach zu verwenden. – Guillaume

Verwandte Themen