Wie zeige ich, welche Felder eine Struktur in GDB hat?

Lesezeit: 2 Minuten

Benutzeravatar von prismofeverything
Prisma von allem

Ich stieß auf eine Struktur (genannt ngx_http_variable_value_t) in meiner GDB-Sitzung (Debugger) und ich möchte drucken, welche Felder es in der Konsole hat.

Ist das möglich?

Nates Benutzeravatar
Nate

Sie können den GDB-Befehl verwenden ptype um die Definition einer Struktur oder Klasse auszudrucken.

Zusätzlich verwenden ptype /o zum Drucken von Offsets und Größen aller Felder in einer Struktur (wie pahole).

  • Dies ist die richtige Antwort. zB “(gdb) ptype tm” “type = struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; long tm_gmtoff; const char *tm_zone; } “

    – gaoithe

    19. Februar 2016 um 12:30 Uhr


  • Was ist mit Offsets?

    – Konrad Meyer

    2. Juni 2016 um 23:17 Uhr

  • @ConradMeyer Ich verwende dies für Offsets: (gdb) p &((struct foo *)0)->member. Wäre schön, etwas Nicht-Hacky zu haben.

    – Kuppel

    26. April 2017 um 11:34 Uhr

  • @domen Ja, das ist auch mein Hack. Auch auf der Suche nach etwas nicht-hacky und schneller zu tippen :-).

    – Konrad Meyer

    28. April 2017 um 15:44 Uhr


  • @ConradMeyer Put macro define offsetof(t, f) &((t *) 0)->f) hinein ~/.gdbinit. Dann können Sie verwenden (gdb) p offsetof(struct foo, member).

    – Kuppel

    25. August 2017 um 9:37 Uhr

Wenn Sie Debugging-Symbole eingebaut haben, sollten Sie nur den Wert drucken können: print variable oder print *variable wenn es ein Zeiger auf eine Struktur ist.

  • Und wenn die Variable ein generischer Zeiger ist, z. B. void*, können Sie sie in den erforderlichen Typ umwandeln. print ((MY_STRUCT *)variable)oder um ein bestimmtes Element der Struktur zu erhalten print ((MY_STRUCT *)variable->my_structure_element.

    – Phil DD

    18. Oktober 2013 um 21:49 Uhr


Ciro Santilli Benutzeravatar von OurBigBook.com
Ciro Santilli OurBigBook.com

set print pretty on

Diese Option gibt auch Zeilenumbrüche und Einrückungen für p *my_struct_pointer.

Was bevorzugen Sie:

$2 = {path = {mnt = 0xffff8800070ce1a0, dentry = 0xffff880006850600},last = {{{hash = 3537271320, len = 2}, hash_len = 12127205912}, name = 0xffff88000659501c "../b.out"}

oder:

$3 = {
  path = {
    mnt = 0xffff8800070ce1a0, 
    dentry = 0xffff880006850600
  }, 
  last = {
    {
      {
        hash = 3537271320, 
        len = 2
      }, 
      hash_len = 12127205912
    }, 
    name = 0xffff88000659501c "../b.out"
  },
}

Benutzeravatar von cs01
cs01

Zusätzlich zur Verwendung der Befehlszeilenoption können Sie auch grafische Debugger verwenden. Ich schlage vor gdbguiaber da draußen gibt es einige.

Bildschirmfoto

Haftungsausschluss: Ich bin der Entwickler von gdbgui

  p *((struct my_struct*) variable)

Dies wird Ihnen helfen, die Details von struct in gdb zu drucken

Ich habe dies nur über grafische Frontends für gdb getan. Habe diesen Eintrag in gdb online docs gefunden. Ich hoffe es hilft. Ich glaube, dies erfordert, dass der Code mit enthaltenen Debugging-Informationen erstellt wurde.

Typ [arg]
ptype akzeptiert die gleichen Argumente wie whatis, gibt aber eine detaillierte Beschreibung des Typs aus, anstatt nur den Namen des Typs.

Debugging mit GDB:Symbols

Benutzeravatar von gnud
Gnud

Ich würde mir die mal anschauen Datenanzeige-Debugger.

1418800cookie-checkWie zeige ich, welche Felder eine Struktur in GDB hat?

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

Privacy policy