Question

J'ai essayé de débogage à distance une application 32 bits sur Linux x86_64 suse, mais obtenir ce « registre distant mal formaté » erreur.

Je commence le gdbserver que l'écoute sur le port 12345 (gdbserver localhost: 12345 My_Prog)

Et voici 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)

Ceci est la machine du serveur de débogage (uname -a):

Linux serveur 2.6.16.60-0.31-smp # 1 SMP Mar 7 16:16:29 UTC oct 2008 x86_64 x86_64 x86_64 GNU / Linux

Et ceci est la machine client de débogage (uname -a):

Linux client 2.6.16.54-0.2.5-default # 1 Lun 21 janvier 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux

Les deux machines sont en cours d'exécution dans des machines virtuelles bien (VMWare). Le binaire gdbserver est copié à partir de la machine cliente à la machine serveur.

(debugger à distance parce que l'environnement d'exécution sur le serveur de débogage est semblable à la production, et ne contient pas d'outils de développement, l'accès au code source, etc.)

Toutes les suggestions sont les bienvenus.

Mise à jour: cela a fonctionné pour moi en exécutant la commande suivante dans gdb:

l'architecture i386 ensemble: x86-64

Était-ce utile?

La solution

Peut-être vous avez besoin d'exécuter quelque chose comme set architecture i386 à l'invite de (gdb)? Qu'est-ce que show architecture dire après vous être connecté à la cible à distance?

Autres conseils

A GDB 64 bits peut déboguer directement les 32 et 64 bits processus inférieurs (je crois que ce qu'on appelle le support multi-arc).

Pas avec gdbserver: il ne supporte pas le débogage multi-arcade

.

Vous avez besoin d'un gdbserver qui correspond à l'architecture cible, et qui correspond à gdb gdbserver. les construire à partir des sources, configurer avec --target=i686.

Peut-être que vous avez déjà vérifié cela, mais voilà:  - Sur la machine 64 bits, avez-vous des bibliothèques 32 bits de celui-ci (libc, etc.)?  - Avez-vous essayé de courir gdb avec le « -nx » (pas de fichiers d'initialisation) commutateur

?

1) Vous avez besoin d'un gdbserver approprié pour votre machine cible et votre machine hôte (celui qui correspond à la machine cible dans votre cas.

Disons que je veux déboguer une cible ppc à partir d'un hôte x86:

Je aurai besoin sur ma cible un gdbserver exécutable ppc.

Je aurai besoin sur mon hôte un exécutable x86 gdb pour powerpc.

Après que vous définissez avec ces choses que vous devez faire ce qui suit à partir de votre gdb hôte avant la connexion à la cible dans le cas où vous utilisez libs partagées:

set-solib préfixe absolu $ ELDK_PREFIX / eldk-4,2-ppc_4xx / $ CROSS_COMPILE

dir $ ELDK_PREFIX / eldk-4,2-ppc_4xx / $ CROSS_COMPILE

sinon le gdb hôte devenir fou en essayant de charger libs partagées pour x86.

Je pense que vous devez exécuter gdb sur votre machine hôte avec une copie du programme cible. C'est à dire. si vous exécutez gdbserver myprog sur votre machine cible, vous devez copier sur myprog à la machine hôte et exécutez gdb myprog.

Cette gdb manière sur la machine hôte choisira automatiquement l'architecture de l'exécutable. Courir gdb sur l'hôte comme celui-ci chargera également les symboles, sans lesquels vous obtiendrez des symboles non résolus (points d'interrogation).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top