Wie kann man einen Zeiger wie ein Array in GDB anzeigen?

Lesezeit: 3 Minuten

Benutzeravatar von CDT
CDT

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?

  • 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


Benutzeravatar von Ivaylo Strandjev
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 & oder sizeofaber 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 ints, es wird nicht helfen, zB wenn Array enthält structs.

    – Hallo Engel

    5. Dezember 2018 um 9:36 Uhr

Benutzeravatar von Gabriel Staples
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:

  1. print/x *[email protected] = Hex
  2. print/d *[email protected] = vorzeichenbehaftete Ganzzahl
  3. print/u *[email protected] = Ganzzahl ohne Vorzeichen
  4. print/<format> *[email protected] = Druck nach dem Allgemeinen printf()-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/uda 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

1418310cookie-checkWie kann man einen Zeiger wie ein Array in GDB anzeigen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy