2016-06-05 11 views
3

Ich möchte ein SharedLib debuggen, die von Main aufgerufen wird. Ich habe die Quellen der SharedLib und von Main. Ich kompiliere und verbinde Main und SharedLib mit der Option -g3. Die Variablen PATH und LD_LIBRARY_PATH enthalten /PathToSharedLib. Ich setze einen Haltepunkt in b FileOfSharedLib.c um NNN.gdb: Wie Debuggen einer freigegebenen Bibliothek

(gdb) file /PathToMain/Main 
Reading symbols from /PathToMain/Main...done. 
(gdb) set directories /PathToSourceOfSharedLib 
(gdb) set solib-search-path /PathToSharedLib 
(gdb) sharedlibrary SharedLib 
No loaded shared libraries match the pattern `SharedLib` 
(gdb) b FileOfSharedLib.c:NNN 
No source file named FileOfSharedLib.c. 
Make breakpoint pending on future shared library load? (y or [n]) y 
(gdb) run 

Es hört nie an dem Unterbrechungspunkt auf, der mehrfach von Main aufgerufen wird. Ich sehe es durch printf-Anweisungen im Log der SharedLib. Es sieht so aus, als ob die SharedLib von gdb nicht berücksichtigt wird.

überprüfte ich die sharedlib und die FileOfSharedLib.c:

(gdb) file /PathToSharedLib/SharedLib 
Reading symbols from /PathToSharedLib/SharedLibl...done. 
(gdb) b FileOfSharedLib.c:123 
Breakpoint 1 at 0x43d7f: file FileOfSharedLib.c, line 123. 
(gdb) 

ich Ubuntu 14.04.3 LTS leite (GNU/Linux 3.13.0-66-generic i686) mit gcc 4.8.4 und gdb 7.7 .1.

Antwort

4

Es stoppt nie an der Bruchstelle, die mehrfach von Main aufgerufen wird.

Dies deutet auf einen Fehler in GDB hin. Leider ist Ihre Version von GDB für Entwickler zu alt. Versuchen Sie, dieses Verhalten mit der aktuellen GDB 7.11.1 zu reproduzieren, und melden Sie einen Fehler in GDB bugzilla, falls es reproduziert.

Wenn Sie GDB 7.11.1 nicht verwenden möchten, können Sie diesen Fehler umgehen, indem Sie einen Haltepunkt setzen, nachdem die gemeinsam genutzte Bibliothek geladen wurde.

Wenn die Bibliothek in das Hauptprogramm verbunden ist, direkt, sollte folgende Reihenfolge funktionieren:

(gdb) start 
# GDB stop on entry to main 

(gdb) b FileOfSharedLib.c:NNN # should find the source now 

Wenn die Bibliothek ist dlopen ed, werden Sie einen temporären Haltepunkt in der Haupt exectable festlegen müssen irgendwo nach dass dlopen.

Eine andere Problemumgehung: set stop-on-solib-events 1. Dadurch wird GDB gestoppt, nachdem eine neue gemeinsame Bibliothek hinzugefügt (oder entfernt) wurde.