2010-06-18 5 views
5

Mam dwa identyczne 64-bitowe komputery Centos 5, które są połączone w sieć i udostępniają ich/home mount. Kompiluję prosty program Hello World na jednym, a potem zorientowałem się, jak używać gdb na jednym komputerze, aby zdalnie debugować jego działanie na innym komputerze. To wydaje się działać dobrze, gdy wszyscy domyślnie przyjmują 64 bitness.Używanie gdb i gdbserver z 32-bitowym binarnym na 64-bitowym komputerze z Centos 5 narzeka na dostęp do pamięci lub źle sformatowane dane.

Jednakże, jeśli skompiluję mój Hello World z -m32 do wygenerowania 32-bitowego pliku binarnego, sposób w jaki kompilowany jest nasz pełny system, wtedy nie mogę wymyślić, jak uzyskać prawidłowe połączenie z gdb i gdbserver. Zanim spróbuję tego na naszym pełnym systemie, myślę, że powinienem to zrobić z Hello. W zależności od tego, jak próbuję połączyć się z gdb i gdbserver, otrzymuję wiadomości o źle sformatowanych rejestrach, ostrzeżeniach o niedopasowaniu architektury lub nielegalnych odniesieniach do pamięci.

Wydaje mi się, że nie mam pojęcia, jakie są konsekwencje -m32 w mojej kompilacji i nie mam pojęcia, jak uruchomić gdb i gdbserver, czy też właściwą kolejność określania architektury lub plików lub czegoś podobnego. :(

Co trzeba zrobić, aby użyć gdb i gdbserver na 32 bit (-m32) wykonywalnego na polu linux 64 bit?

poniższych przykładach i dziękuję,

Jerry

witam.cpp:

#include <iostream> 
int main(int argc, char *argv[]) 
{ 
    std::cout << "Hello World." << std::endl; 
    return -1; 

} 

Oto trzy trasy:

  1. W gdb, ustaw architektury i386/następnie łączą się gdbserver => Bad architektury
  2. W gdb, zestaw architektury i386/pliku hello/następnie połączyć do gdbserver => złej architektury
  3. W gdb ustaw architektura (niesłusznie) i386: x86-64/plik hello /, a następnie połączyć się gdbserver => nie można uzyskać dostępu do pamięci

albo w nieco bardziej szczegółowo:

==============================

Dla każdego biegu zdalny gdbserver powiedział:


    $ gdbserver --multi rdev6:2010 hello 
    Process hello created; pid = 32603 
    Listening on port 2010 
    Remote debugging from host 134.51.26.149 
    readchar: Got EOF 
    Remote side has terminated connection. GDBserver will reopen the connection. 
    Listening on port 2010 

I na nasz lokalny:

============================ ==

  • Zakładając, że jest to 328-bitowy, ustawienie archi do i386, a następnie łączenia uwaga: na stronie gdb wykonywalny nie został określony lub załadowane

    $ gdb 
    GNU gdb Fedora (6.8-37.el5) 
    his GDB was configured as "x86_64-redhat-linux-gnu". 
    (gdb) set archi i386 
    The target architecture is assumed to be i386 
    (gdb) target extended-remote rdev6:2010 
    Remote debugging using rdev6:2010 
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64 
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    Try to load the executable by `file' first, 
    you may also check `set/show architecture'. 
    (gdb) 

=================== ===========

  • Zakładając, że jest 32 bit i386, i386 do ustawiania archi, następnie łączenia uwaga: na stronie gdb, plik został załadowany z pliku

    $ gdb 
    GNU gdb Fedora (6.8-37.el5) 
    his GDB was configured as "x86_64-redhat-linux-gnu". 
    (gdb) set archi i386 
    The target architecture is assumed to be i386 
    (gdb) file hello 
    Reading symbols from /home/j/hello...done. 
    (gdb) target extended-remote rdev6:2010 
    Remote debugging using rdev6:2010 
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64 
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    Try to load the executable by `file' first, 
    you may also check `set/show architecture'. 
    (gdb) sho archi 
    The target architecture is assumed to be i386 
    (gdb) 

==============================

  • Przy założeniu (które powinny być błędne), że jest to i386: x86-64, ustawienie archi do i386: x86-64, a następnie łączenia uwaga: na stronie gdb, plik został załadowany z pliku

    $ gdb 
    GNU gdb Fedora (6.8-37.el5) 
    This GDB was configured as "x86_64-redhat-linux-gnu". 
    (gdb) set archi i386:x86-64 
    The target architecture is assumed to be i386:x86-64 
    (gdb) file hello 
    Reading symbols from /home/j/hello...done. 
    (gdb) show archi 
    The target architecture is assumed to be i386:x86-64 
    (gdb) target extended-remote rdev6:2010 
    Remote debugging using rdev6:2010 
    [New Thread 32667] 
    Cannot access memory at address 0x800000008 
    (gdb) 

Odpowiedz

4

Jeśli chcesz debugować proces 32-bitowe przy użyciu 64 -bit gdb/gdbserver, potrzebujesz nowszej wersji GDB. W szczególności, trzeba to:

gdbserver/ChangeLog: 

2009-05-12 Doug Evans <[email protected]> 

     Biarch support for i386/amd64 gdbserver. 

Alternatywnie, można zbudować gdb/gdbserver już masz od źródła w trybie 32-bitowym, uruchamiając

./configure CC='gcc -m32' 

i używać gdb32/gdbserver32 debugowanie procesów . Nie widzę w tym żadnej korzyści - nowsze wersje GDB mają wiele poprawek, przyspieszeń i ładnych drukarek STL.

+0

Dziękuję bardzo, naprawdę doceniam twoją pomoc, a spróbuję tego jutro w pracy. –

+0

I tak, przeglądałem podręcznik do najnowszego gdbserver 2 dni temu i prawie spisekowałem, kiedy znalazłem ładne drukarki. –

+0

Przepraszamy za przywrócenie bardzo starego tematu, ale zastanawiam się, czy jest jakiś sposób bez aktualizacji GDB. Pracuję na komputerze z systemem Windows, aby się połączyć, więc czy mogę zbudować 32-bitowy tryb gdb dla systemu Windows? –

Powiązane problemy