L'utilisation de gdb et gdbserver avec un 32 bits en binaire sur un ordinateur 64 bits avec Centos 5 se plaint d'accès à la mémoire ou une mauvaise mise en forme des données

J'ai deux identiques 64 bits Centos 5 machines, qui sont en réseau et de partager leur /home mont. Je compile un simple programme "Hello World" sur l'un, et puis j'ai compris comment utiliser gdb sur une machine à déboguer à distance en cours d'exécution sur l'autre machine. Qui semble bien fonctionner quand tout le monde par défaut est 64 nombre de bits.

Cependant, si je compile mon Hello World avec -m32 pour générer un 32 bits binaires, le chemin complet de notre système est en cours de compilation, alors je ne peux pas comprendre comment obtenir de gdb et gdbserver à se connecter correctement. Avant je l'ai essayer sur l'intégralité de notre système, je me dis que je devrais le faire fonctionner avec bonjour. En fonction de la façon dont j'essaie de connecter gdb et gdbserver, soit je reçois des messages sur une mauvaise mise en forme des registres, des mises en garde à propos de l'architecture de l'inadéquation ou illégale références de mémoire.

Me semble que j'ai un peu de compréhension de ce que les implications de -m32 sont dans ma compilation et aucune idée de la façon de lancer gdb et gdbserver ou la droite afin de préciser l'architecture ou des fichiers ou quelque chose. 🙁

Que faut-il pour utiliser gdb et gdbserver sur un 32 bits (-m32) exécutable 64 bits sous linux?

Exemples ci-dessous, et je vous remercie,

Jerry

hello.cpp:

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

}

Voici trois pistes:

  1. Dans gdb, définir l'architecture i386 /puis connectez-vous à gdbserver => mauvais architecture
  2. Dans gdb, définir l'architecture i386 /fichier bonjour /puis connectez-vous à gdbserver => mauvais architecture
  3. Dans gdb, définir l'architecture (à tort) i386:x86-64 /fichier bonjour /puis connectez-vous à gdbserver => Ne peut pas accéder à la mémoire

Ou dans un peu plus en détail:

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

Pour chaque course, la distance gdbserver dit:


    $ 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

Et sur notre local:

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

  • En supposant qu'il est i386 32 bits, réglage de l'archi pour i386, puis de connecter
    remarque: sur le gdb côté, l'exécutable n'a pas été spécifiée ou chargé

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

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

  • En supposant qu'il est i386 32 bits, réglage de l'archi pour i386, puis de connecter
    remarque: sur le gdb côté, l'exécutable a été chargé avec le fichier

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

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

  • En supposant (ce qui devrait être incorrecte) qu'il est i386:x86-64, réglage de l'archi pour i386:x86-64, puis de connecter
    remarque: sur le gdb côté, l'exécutable a été chargé avec le fichier

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

OriginalL'auteur Jerry Asher | 2010-06-18