2010-04-15 14 views
9

Ich habe eine gemeinsame Bibliothek libtest.so, die mit dlopen in das Hauptprogramm geladen wird. Funktion test() residieren in libtest.so und werden im Hauptprogramm durch dlsym aufgerufen. Gibt es eine Möglichkeit, einen Breakpoint unter test einzurichten?Wie setze ich Haltepunkt auf Funktion in einer gemeinsamen Bibliothek, die nicht in gdb geladen wurde

Bitte beachten Sie, dass das Hauptprogramm während der Verbindungszeit nicht mit libtest.so verknüpft wurde. Andernfalls sollte ich den Haltepunkt festlegen können, obwohl es sich um eine ausstehende Aktion handelt. In meinem Fall, wenn ich b test mache, wird gdb mir Function "test" not defined sagen.

+0

Könnten Sie einen Haltepunkt auf 'test' nach dem Laden' libtest.so' mit 'dlopen' eingestellt? –

Antwort

11

Eigentlich sollte gdb Ihnen sagen, dass es in der Lage das Symbol in der Zukunft zu lösen, wenn neue Bibliotheken geladen werden:

(gdb) b test 
Function "test" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (test) pending. 
(gdb) r 

Und später, wenn die .so-Objekt geladen wird, wird es den Haltepunkt beheben, zB:

Reading symbols for shared libraries . done 
Breakpoint 1 at 0xcafebebe 
Pending breakpoint 1 - "test" resolved 
+0

In der GDB, die ich benutze, selbst wenn ich "Breakpoint pending auf" setze, werde ich NICHT fragen, ob ich das ausstehende Verhalten haben möchte, wenn das Symbol nicht definiert ist. Es sagt mir nur "Kann nicht finden, Mitglied Bla Bla Tipp Tab bla bla" –

6

Eigentlich wird diese Methode nicht immer funktionieren.

Angenommen, ich habe mehrere gemeinsame Bibliotheken, die jeweils eine Funktion namens "Init" haben. Wenn ich eine andere Bibliothek geladen habe, wird "b Init" den Haltepunkt auf die falsche Instanz der Funktion "Init" setzen. Also muss ich den Breakpoint wie folgt angeben:

(GDB) b object5.c: 66

Keine Quelldatei namens object5.c.

+0

In meinem Fall das Problem, das ich gefunden habe, muss ich mit Debug-Symbolen kompilieren (um Haltepunkte in einem benutzerdefinierten .so). –

1

wie Sie einen Haltepunkt für eine freigegebene Lib festlegen.

[Es ist durchaus üblich, einen Haltepunkt in einer gemeinsamen Bibliothek zu haben. Gemeinsam genutzte Bibliotheken können explizit und möglicherweise wiederholt geladen und entladen werden, wenn das Programm ausgeführt wird. Um diesen Anwendungsfall zu unterstützen, aktualisiert gdb die Haltepunktpositionen, sobald eine gemeinsam genutzte Bibliothek geladen oder entladen wird. Normalerweise würden Sie zu Beginn Ihrer Debugsitzung einen Haltepunkt in einer gemeinsam genutzten Bibliothek festlegen, wenn die Bibliothek nicht geladen ist und wenn die Symbole aus der Bibliothek nicht verfügbar sind. Wenn Sie versuchen, Breakpoint zu setzen, wird gdb Sie fragt, ob Sie eine so genannte anhängige Unterbrechungs-Unterbrechungsadresse, die einstellen wollen, ist noch nicht geklärt.]

Zitat aus https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

(GDB) b object5.c: 66 Keine Quelldatei namens object5.c.

vielleicht können Sie "set Verzeichnis the_location_of_object5.c_file" verwenden, es zu beheben.

  • Liste item
0

Eine andere Möglichkeit ist es, den Dateinamen und der Funktion zu spezifizieren, z.B .:

b object5.c:test 

Dies sollte eindeutig sein.Vielleicht möchten Sie auch den Weg auf den Quellcode spezifizieren, indem (wie bereits angedeutet):

set directories path_of_object5.c 
Verwandte Themen