Débogage à distance à l'erreur avec GDB
J'ai essayé de débogage à distance une application 32 bits sur x86_64 suse linux, mais obtenir cette "distance registre mal formaté" erreur.
Je démarre gdbserver à l'écoute sur le port 12345 (gdbserver localhost:12345 my_prog)
Et c'est l'erreur:
$ gdb
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
(gdb) target remote <ip>:12345
Remote debugging using <ip>:12345
Remote register badly formatted: T0506:0000000000000000;07:80b8bcff00000000;10:4028f0f700000000;
here: 0000000;07:80b8bcff00000000;10:4028f0f700000000;
(gdb)
C'est le debug machine serveur (uname -a):
Serveur Linux 2.6.16.60-de 0,31-smp #1 SMP tue Oct 7 16:16:29 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux
Et c'est le client de débogage de la machine (uname -a):
Client Linux 2.6.16.54-0.2.5-par défaut #1 Lun Jan 21 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux
Les deux machines sont en cours d'exécution dans les machines virtuelles si (VMWare). Le gdbserver binaire est copié à partir de la machine client pour le serveur de la machine.
(Je débogage à distance, parce que l'environnement d'exécution sur le débogage du serveur est de type production, et ne contiennent pas des outils de développement, d'accès au code source, etc.)
Toutes les suggestions sont les bienvenues.
Mise à JOUR: cela a fonctionné pour moi en émettant la commande suivante dans gdb:
définir l'architecture i386:x86-64
Vous devez vous connecter pour publier un commentaire.
Peut-être vous avez besoin d'exécuter quelque chose comme
set architecture i386
à la(gdb)
invite? Ce n'show architecture
dire à la suite de vous connecter à distance à une cible?64 bits GDB peut directement déboguer à la fois 32 et 64 bits inférieurs processus (qui je crois est appelée multi-soutien de la voûte).
Pas avec
gdbserver
: il ne prend pas en charge le multi-arch de débogage.Vous avez besoin d'un
gdbserver
qui correspond à l'architecture cible, etgdb
qui correspond àgdbserver
. Construire, à partir d'une source de configurer avec--target=i686
.Peut-être que vous avez déjà vérifié cela, mais va ici:
- Sur la machine 64 bits, avez-vous des 32-bits des bibliothèques de celui-ci (libc, etc)?
- Avez-vous essayé de lancer gdb avec le "nx" (pas de fichiers d'initialisation) interrupteur?
1) Vous avez besoin d'un gdbserver pour votre machine cible et de votre machine hôte (celui qui correspond à la cible de la machine dans votre cas.
Disons que je veux pour déboguer un ppc cible à partir d'un x86 d'accueil:
J'ai besoin sur ma cible un ppc exécutable gdbserver.
J'ai besoin sur mon hôte, un x86 exécutable gdb pour powerpc.
Après avoir configuré avec les choses que vous avez à effectuer les opérations suivantes à partir de votre hôte gdb avant de se connecter à la cible dans le cas où vous utilisez des libs:
ensemble solib-absolue-préfixe $ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE
$dir ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE
sinon l'hôte gdb va devenir fou en essayant de charger des libs pour x86.
Je pense que vous avez besoin de lancer gdb sur votre machine hôte avec une copie de la cible du programme. I. e. si vous exécutez
gdbserver myprog
cible sur votre machine, vous devez les copier surmyprog
à la machine hôte et d'exécutergdb myprog
.De cette façon gdb sur la machine hôte est automatiquement chercher l'architecture à partir de l'exécutable. L'exécution de gdb sur l'hôte, comme ce sera aussi charger les symboles, sans qui vous permettrait d'obtenir des symboles non résolus (point d'interrogation).