2009-03-30 12 views
5

Ich habe versucht, eine 32-Bit-Anwendung auf x86_64-suse-Linux remote zu debuggen, aber diesen Fehler "Remote-Registrierung schlecht formatiert".Remote-Debug-Fehler mit GDB

Ich starte das gdbserver als auf Port 12345 bis (gdbserver localhost: 12345 my_prog)

Und das ist der Fehler:

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

Dies ist die Debug-Server-Maschine (uname -a):

Linux-Server 2.6.16.60-0.31-smp # 1 SMP Di 7. Oktober 16.16.29 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

Und dies ist die Debug-Client-Maschine (uname -a):

Linux-Client 2.6.16.54-0.2.5-default # 1 Mo 21. Januar 13.29.51 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

Beide Maschinen obwohl in virtuellen Maschinen ausgeführt werden (VMWare). Die Binärdatei gdbserver wird vom Clientcomputer auf den Servercomputer kopiert.

(I Remote-Debug weil die Laufzeitumgebung auf dem Debug-Server produktionsähnlichen ist, und enthält keine Entwicklungs-Tools, Zugriff auf den Quellcode etc.)

Alle Vorschläge sind willkommen.

UPDATE: dies für mich gearbeitet, indem Sie den folgenden Befehl in gdb Ausgabe:

Satz-Architektur i386: x86-64

Antwort

3

Vielleicht brauchen Sie so etwas wie set architecture i386 an der (gdb) Prompt ausführen? Was sagt show architecture, nachdem Sie eine Verbindung zum Remote-Ziel hergestellt haben?

+0

Es heißt i386 (auto). Eigentlich, wenn ich arch auf "i386: x86-64: intel" setze, startet es ohne die Fehlermeldung, aber wenn ich versuche, den Code zu betreten, gibt es mir: "Kann nicht auf Speicher an Adresse 0x1f7fb5000 zugreifen". – boffman

+0

Können Sie die ganze Sache (gdbserver, gdb, 32-Bit-App) auf dem Client-Rechner ausführen? Treten die gleichen Probleme auf? – sigjuice

0

Vielleicht haben Sie dies bereits überprüft, aber hier geht: - Auf der 64-Bit-Maschine, haben Sie 32-Bit-Bibliotheken davon (libc, etc)? - Haben Sie versucht, gdb mit dem Schalter "-nx" (keine Initialisierungsdateien) auszuführen?

+0

Ja, 32-Bit-Bibliotheken sind in/lib und 64-Bit sind in/lib64. Ich habe versucht, gdb-nx, aber ich konnte keinen Unterschied bemerken? – boffman

2

Eine 64-Bit-GDB kann sowohl 32- als auch 64-Bit-Inferior-Prozesse direkt debuggen (ich glaube, dies wird Multi-Arch-Unterstützung genannt).

Nicht so mit gdbserver: es unterstützt Multi-Arch-Debuggen nicht.

Sie benötigen eine gdbserver, die Zielarchitektur entspricht, und gdb, die gdbserver entspricht. Erstellen Sie sie aus der Quelle, konfigurieren Sie sie mit --target=i686.

0

1) Sie brauchen eine richtige gdbserver für Ihre Zielmaschine und Host-Maschine (die, die die Zielmaschine in Ihrem Fall passt

Lassen Sie uns sagen, dass ich ein ppc Ziel von einem x86-Host zu debuggen.

ich werde ein ppc ausführbaren gdbserver auf meinem Ziel benötigt.

ich auf meinem Host eine x86 ausführbare gDB für powerpc benötigen.

Nachdem Sie sich mit diesen Dingen festgelegt werden, haben Sie die folgenden von Ihrem Host gdb zu tun, bevor mit dem Ziel, falls Verbinden Sie verwenden den gemeinsamen Libs:

Satz solib-absolute-Präfix $ ELDK_PREFIX/eldk-4.2- ppc_4xx/CROSS_COMPILE $

dir $ ELDK_PREFIX/eldk-4.2-ppc_4xx/$ CROSS_COMPILE

sonst der Host gDB erhalten verrückt geteilt libs für x86 zu laden versucht.

0

Ich denke, Sie müssen gdb auf Ihrem Host-Rechner mit einer Kopie des Zielprogramms ausführen. I.e. Wenn Sie gdbserver myprog auf Ihrem Zielcomputer ausführen, müssen Sie über myprog auf den Hostcomputer kopieren und gdb myprog ausführen.

Auf diese Weise wird gdb auf dem Host-Rechner automatisch die Architektur von der ausführbaren Datei abholen. Wenn Sie gdb auf dem Host ausführen, werden auch die Symbole geladen, ohne die Sie ungelöste Symbole (Fragezeichen) erhalten würden.