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:
- Dans gdb, définir l'architecture i386 /puis connectez-vous à gdbserver => mauvais architecture
- Dans gdb, définir l'architecture i386 /fichier bonjour /puis connectez-vous à gdbserver => mauvais architecture
- 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
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez déboguer un processus 32 bits sur 64 bits gdb/gdbserver, vous avez besoin d'une version plus récente de GDB. En particulier, vous avez besoin de ceci:
Alternativement, vous pouvez construire gdb/gdbserver vous avez déjà à partir de la source en mode 32 bits en cours d'exécution
et l'utilisation gdb32/gdbserver32 pour déboguer vos processus. Je ne vois pas l'avantage de le faire -- il y a des versions plus récentes de GDB ont beaucoup de corrections, la vitesse, et STL très imprimantes sont gentils.
Et oui, j'ai regardé sur le manuel pour la dernière gdbserver 2 jours, et presque plotzed quand j'ai découvert la jolie imprimantes.
Désolé de relancer un très vieux sujet, mais je me demande si il n'y a aucune façon sans la mise à jour de GDB. Je suis en train de travailler sur une machine Windows pour se connecter, je peux donc construire 32 bits mode de gdb pour Windows?
OriginalL'auteur Employed Russian