2012-12-23 8 views
10

Próbuję zdalnie debugować aplikację uruchomioną na komputerze o adresie 192.168.98.64. Na tej maszynie biegnę:Zdalne debugowanie GDB nie może znaleźć symboli

 
gdbserver serveripaddr:4444 progname 

następnie z serwera biegnę „gdb”, a następnie w gdb szybkiego biegu:

 
(gdb) target remote 192.168.98.64:4444 
Remote debugging using 192.168.98.64:4444 
[New Thread 28432] 
warning: Could not load vsyscall page because no executable was specified 
try using the "file" command first. 
0xb775e810 in ??() 
(gdb) break internal[TAB] 

Spodziewałem się naciśnięcie klawisza TAB, gdy próbuje ustawić mój punkt przerwania, aby wyświetlić listę odpowiednich funkcji, zaczynając od wewnętrznego, ale nic nie wywołuje. Kod został skompilowany z włączonym debugowaniem z opcją -g. Co ja robię źle?

Odpowiedz

8

biegnę "gdb"

Ci mają dać GDB wykonywalny debugujesz (najlepiej non-pozbawiono wersja IT):

gdb /path/to/progname 
(gdb) target remote 192.168.98.64:4444 
3

prostu napotkał ten sam problem, gdy użyłem skompilowanego gdb (generalnie potrzebujesz tego, jeśli twój host zdalny ma inną architekturę). W takim przypadku symbole należy odczytać z pliku binarnego skompilowanego na zdalnym hoście. Pomyślałem, że następujące prace dla mnie (również jeśli architektur na hostach są takie same):

na zdalnym komputerze:

gdbserver [host]:[port] [remote-path-to-binary-from-gdbserver-workdir] 

a następnie na lokalnym komputerze w (cross-kompilowany) gdb:

shell sleep 5 
target remote [host]:[port] 
symbol-file remote:[remote-path-to-binary-from-gdbserver-workdir] 
directory [local-root-directory-for-source-files] 
continue 

Wymień [*] z danymi. Możesz użyć go jako skryptu gdb (stąd sleep w pierwszym wierszu) lub wprowadź go w wierszu poleceń gdb. Opcjonalny wiersz katalogu mówi, aby dodać lokalny katalog źródłowy do ścieżki wyszukiwania źródeł. Może to być przydatne, jeśli używasz interfejsu, który wskazuje na kod źródłowy.

1

Podczas debugowania zdalnej klient gdb nie wie, gdzie załadować symbole. Masz dwie opcje:

1. specify executable when starting gdb 

gdb <executable> 
(gdb) target remote <IP>:<port> 
(gdb) load <executable> 
gdb should know symbols now 
(gdb) b main 
(gdb) mon reset 
(gdb) contnue 
it should break at main 
(gdb) bt 

2. use file command to tell about the symbols. 

gdb 
(gdb) target remote <IP>:<port> 
(gdb) load <executable> 
(gdb) file <executable> 
gdb should know symbols now 
(gdb) b main 
(gdb) mon reset 
(gdb) contnue 
it should break at main 
(gdb) bt 

PS: Upewnij się, że skompilowany plik wykonywalny z symboli debugowania -g -O0

+0

Jeśli nie używam '-g' w czasie kompilacji mogę wtedy moove tylko przez etykiet że ręcznie określone. Czym dokładnie są symbole debugowania? Czy GDB tworzy etykiety '1:', '2:', '3:' ... dla każdej linii pliku źródłowego? – 71GA

+1

Symbole są informacjami skompilowanymi w systemie binarnym (tryb debugowania) w celu powiązania instrukcji z tekstem kodu. Aby wyświetlić informacje czytelne dla człowieka w debugerze. Aby to działało musisz skompilować się z '-g' i znajdować się w katalogu źródłowym, aby' gdb' mógł znaleźć pliki źródłowe wskazane przez plik binarny debugowania. –