Angenommen definiert: int a[100]
Typ print a
dann zeigt gdb es automatisch als Array an:1, 2, 3, 4...
. jedoch, wenn a
als Parameter an eine Funktion übergeben wird, behandelt gdb ihn als normalen int-Zeiger, Typ print a
wird angezeigt:(int *)0x7fffffffdaa0
. Was soll ich tun, wenn ich sehen möchte a
als Array?
Wie kann man einen Zeiger wie ein Array in GDB anzeigen?
CDT
Ivaylo Strandjev
Sehen hier. Kurz gesagt, Sie sollten Folgendes tun:
p *[email protected]
-
Ich muss die Anzahl der Len kennen, ist es möglich, einfach so etwas zu verwenden
command array
?– CodyChan
23. Juni 2017 um 7:37 Uhr
-
@CodyChan Wenn a als Parameter an eine Funktion übergeben wird, können Sie das nicht tun, da gdb die Größe nicht kennt.
– Ivaylo Strandjev
23. Juni 2017 um 7:39 Uhr
-
@CodyChan Sie können eine etwas größere Nummer übergeben, und es wahrscheinlich wird nicht abstürzen. Nur damit Sie sich ein Bild davon machen können, was los ist.
– Samie Bencherif
22. April 2019 um 3:45 Uhr
-
@GabrielStaples danke, dass du das gemeldet hast. Es zeigt jetzt auf eine ähnliche Ressource
– Ivaylo Strandjev
25. September 2020 um 6:53 Uhr
-
@IvayloStrandjev, helfe gerne! Ich habe auch eine Antwort hinzugefügt, die einige nette Formatierungsoptionen demonstriert und verschiedene Beispiele der gdb-Ausgabe zeigt, hier: stackoverflow.com/a/64055978/4561887.
– Gabriel Staples
25. September 2020 um 7:00 Uhr
*(T (*)[N])p
wobei T der Typ, N die Anzahl der Elemente und p der Zeiger ist.
-
Es wirft zuerst
p
auf einen Zeiger-auf-Array-Typ (anstelle eines Zeiger-auf-Element-Typs, der auf das erste Element zeigt), und dereferenziert dann diesen Zeiger, um ein Array-Objekt zu erhalten. In C würde dies in den meisten Kontexten zu einem Zeiger zurückfallen, außer als Operand von&
odersizeof
aber gdb verwendet den Array-Typ direkt, um das Array zu drucken.– R.. GitHub HÖR AUF, EIS ZU HELFEN
26. Januar 2013 um 1:26 Uhr
-
Einfacher:
(T[N])*p
. GDB ist etwas leistungsfähiger als C 😉– Ruslan
17. März 2018 um 8:09 Uhr
-
drucken/x (verkohlen()[20])str
– NikitQa
8. Oktober 2019 um 11:01 Uhr
Verwenden Sie die x
Befehl.
(gdb) x/100w a
-
Das bringt zu viel Output. Ivaylos scheint besser zu sein.
– CDT
26. Januar 2013 um 1:22 Uhr
-
Es ist eine zu spezifische Lösung. Während es für den Anwendungsfall des OP funktioniert
int
s, es wird nicht helfen, zB wenn Array enthältstruct
s.– Hallo Engel
5. Dezember 2018 um 9:36 Uhr
Gabriel Staples
So können Sie sie anzeigen oder drucken beliebig viele Bytes aus irgendein Array in irgendein printf
-Stil-Format Verwendung der gdb
Debugger
Wie @Ivaylo Strandjev hier sagt, lautet die allgemeine Syntax:
print *[email protected]
# OR the shorter version:
p *[email protected]
Beispiel zum Drucken der ersten 10 Bytes von my_array
:
print *[email protected]
[Recommended!] Brauch printf
-Stil Druckformatierung: Wenn die obigen Befehle jedoch wie Müll aussehen, da versucht wird, die Werte als Zeichen zu interpretieren, können Sie verschiedene Formatierungsoptionen wie folgt erzwingen:
print/x *[email protected]
= Hexprint/d *[email protected]
= vorzeichenbehaftete Ganzzahlprint/u *[email protected]
= Ganzzahl ohne Vorzeichenprint/<format> *[email protected]
= Druck nach dem Allgemeinenprintf()
-Formatierungszeichenfolge,<format>
Hier sind einige echte Beispiele aus meinem Debugger, um 16 Bytes von a zu drucken uint8_t
Array benannt byteArray
. Beachten Sie, wie hässlich der erste ist, mit just p *[email protected]
:
(gdb) p *[email protected]
$4 = "\000\001\002\003\004\005\006\a\370\371\372\373\374\375\376\377"
(gdb) print/x *[email protected]
$5 = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}
(gdb) print/d *[email protected]
$6 = {0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1}
(gdb) print/u *[email protected]
$7 = {0, 1, 2, 3, 4, 5, 6, 7, 248, 249, 250, 251, 252, 253, 254, 255}
In meinem Fall ist die beste Version mit der richtigen Darstellung, die ich sehen möchte, die letzte, bei der ich das Array als vorzeichenlose Ganzzahlen drucke print/u
da es sich um ein uint8_t
unsigned Integer Array schließlich:
(gdb) print/u *[email protected]
$7 = {0, 1, 2, 3, 4, 5, 6, 7, 248, 249, 250, 251, 252, 253, 254, 255}
(int[100])*pointer
funktionierte für mich dank des Vorschlags in den Kommentaren von @Ruslan
Wandeln Sie es in einen Array-Typ um oder verwenden Sie die
x
Befehl.– n. 1.8e9-wo-ist-meine-Aktie m.
24. Januar 2013 um 13:22 Uhr
Verwandte für Assemblycode ohne Typen: stackoverflow.com/questions/32300718/…
– Ciro Santilli OurBigBook.com
20. Juli 2018 um 0:07 Uhr