2010-06-18 6 views
5

Ho due macchine Centos 5 identiche a 64 bit, che sono collegate in rete e condividono la loro/home mount. Compilo un semplice programma Hello World su uno, e poi ho capito come usare gdb su una macchina per eseguire il debug in remoto sull'altra macchina. Sembra che funzioni bene quando tutti hanno un valore di 64 testimoni.Utilizzo di gdb e gdbserver con un binario a 32 bit su una macchina a 64 bit con Centos 5 si lamenta dell'accesso alla memoria o dei dati mal formattati

Tuttavia, se compilo il mio Hello World con -m32 per generare un binario a 32 bit, il modo in cui viene compilato il nostro sistema completo, quindi non riesco a capire come ottenere correttamente gdb e gdbserver. Prima di provare sul nostro sistema completo, immagino che dovrei farlo funzionare con ciao. A seconda di come provo a connettere gdb e gdbserver, ricevo messaggi su registri formattati male, avvisi su disallineamenti di architettura o riferimenti di memoria non validi.

Mi sembra di avere poca comprensione di quali siano le implicazioni di -m32 nella mia compilazione e nessuna idea di come avviare gdb e gdbserver o l'ordine giusto per specificare l'architettura oi file o qualcosa del genere. :(

Che cosa ci vuole per usare gdb e gdbserver su un file eseguibile a 32 bit (-m32) su una macchina Linux a 64 bit?

esempi qui sotto, e vi ringrazio,

Jerry

ciao.cpp:

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

} 

Qui ci sono tre piste:

  1. In gdb, impostare l'architettura i386/quindi connettersi a gdbserver => cattiva architettura
  2. In gdb, impostare l'architettura i386/file di ciao/quindi collegare a gdbserver => cattiva architettura
  3. In gdb, architettura set (erroneamente) i386: x86-64/file di ciao/quindi connettersi gdbserver => Impossibile accedere alla memoria

O in un po 'più in dettaglio:

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

Per ogni sessione d' , il gdbserver remota ha detto:


    $ 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 

e sul nostro locale:

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

  • Supponendo che sia i386 32 bit, impostazione archi per i386, quindi collegando nota: sul lato gdb, l'eseguibile non è stato specificato o caricato

    $ 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) 

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

  • Supponendo è i386 32 bit, impostando archi a i386, quindi collegando nota: sul lato gdb, l'eseguibile è stato caricato con il file

    $ 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) 

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

  • Supponendo (che dovrebbe essere corretto) che è i386: x86-64, impostando archi a i386: x86-64, quindi collegando nota: sul lato gdb, l'eseguibile è stato caricato con file di

    $ 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) 

risposta

4

Se si desidera eseguire il debug processo a 32 bit con 64 -bit gdb/gdbserver, hai bisogno di una versione più recente di GDB. In particolare, avete bisogno di questo:

gdbserver/ChangeLog: 

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

     Biarch support for i386/amd64 gdbserver. 

In alternativa, è possibile costruire gdb/gdbserver hai già dalla sorgente in modalità a 32 bit eseguendo

./configure CC='gcc -m32' 

e utilizzare gdb32/gdbserver32 per eseguire il debug dei processi . Tuttavia, non vedo alcun vantaggio nel fare ciò: le versioni più recenti di GDB hanno molte correzioni, aumenti di velocità e le stampanti graziose STL sono belle.

+0

Grazie mille, ho davvero apprezzato il vostro aiuto e ci proverò domani al lavoro. –

+0

E sì, ho guardato il manuale per l'ultimo gdbserver 2 giorni fa, e quasi tracciato quando ho trovato le belle stampanti. –

+0

Ci scusiamo per il recupero di un argomento molto vecchio, ma mi chiedo se non vi sia alcun modo senza aggiornare GDB. Sto lavorando su una macchina Windows per la connessione, quindi posso creare la modalità a 32 bit di gdb per Windows? –