Remote-Debug-Fehler mit GDB
-
22-08-2019 - |
Frage
habe ich versucht, Remote-Debug eine 32-Bit-Anwendung auf x86_64 Suse Linux, sondern erhalten diese "remote-Register falsch formatiert" Fehler.
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 das 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 in virtuelle Maschinen laufen zwar (VMWare). Die gdbserver Binary wird von dem Client-Rechner auf den Server kopiert.
(I remote debuggen, weil die Laufzeitumgebung auf dem Debug-Server ist produktionsähnlichen, und enthalten keine Entwicklungs-Tools, Zugriff auf den Quellcode etc.)
Alle Vorschläge sind willkommen.
UPDATE: für mich gearbeitet, indem Sie den folgenden Befehl in gdb Ausgabe:
set Architektur i386: x86-64
Lösung
Vielleicht brauchen Sie so etwas wie set architecture i386
an der (gdb)
Prompt ausführen? Was bedeutet show architecture
sagen, nachdem Sie auf das entfernte Ziel anschließen?
Andere Tipps
Ein 64-Bit-GDB kann direkt beide debuggen 32 und 64-Bit-inferior Prozesse (Ich glaube, das Multi-Fußgewölbe genannt wird).
Nicht so bei gdbserver
: es ist nicht Multi-Arch-Debugging unterstützt
Sie benötigen einen gdbserver
die Zielarchitektur entspricht, und gdb
die gdbserver
übereinstimmt. Bauen sie von der Quelle, konfigurieren Sie mit --target=i686
.
Vielleicht haben Sie überprüft, das schon, aber hier geht: - An der Maschine 64-bit, haben Sie 32-Bit-Bibliotheken davon (libc, usw.)? - Haben Sie versucht, GDB mit dem „nx“ läuft (keine Initialisierungsdateien) Schalter
?1) Sie brauchen eine richtige gdbserver für Ihre Zielmaschine und Host-Maschine (die, die die Zielmaschine in Ihrem Fall paßt.
Lassen Sie sich sagen, dass ich ein ppc Ziel von einem x86-Host-debuggen möge:
Ich werde eine ppc ausführbaren gdbserver auf meinem Ziel benötigen.
Ich werde eine x86 ausführbare GDB für powerpc auf meinem Host benötigen.
Wenn Sie sich mit diesen Dingen festgelegt werden, haben Sie die folgenden von Ihrem Host gdb zu tun, bevor mit dem Ziel, falls Sie eine Verbindung geteilt Libs verwenden:
gesetzt 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 versuchen, geteilt Libs für x86 zu laden.
Ich glaube, Sie gdb auf dem Host-Maschine mit einer Kopie des Zielprogramms ausgeführt werden müssen. D. h wenn Sie gdbserver myprog
auf Ihrem Zielrechner auszuführen, müssen Sie über myprog
auf dem Host-Rechner und führen gdb myprog
kopieren.
Auf diese Weise GDB auf dem Host-Rechner wird automatisch die Architektur aus dem ausführbaren abholen. GDB auf dem Host wie diese laufen auch die Symbole laden, ohne die Sie nicht aufgelöste Symbole erhalten (Fragezeichen).