Wie deklariere ich eine Variable im Bereich einer bestimmten Funktion mit GDB?

Lesezeit: 3 Minuten

Benutzer-Avatar
Zufallsblau

Ich weiß, dass gdb eine bereits deklarierte Variable zulässt einstellen Verwendung der set Befehl.

Ist es möglich, dass gdb eine neue Variable innerhalb des Geltungsbereichs einer bestimmten Funktion dynamisch deklariert?

  • Was würde es nützen? Der Code würde sich seiner Existenz nicht bewusst sein.

    – James McLaughlin

    23. April 2012 um 16:06 Uhr

  • Stimme trotzdem @JamesMcLaughlin zu, um es klar zu sagen: neines ist nur für die Inspektion.

    – Adriano Repetti

    23. April 2012 um 16:09 Uhr

  • Sind Sie sicher, dass Sie keine gdb-Variable wollen? Du kann Erstellen Sie zu Ihrer Bequemlichkeit Variablen im Kontext von gdb, wie z set $foo = ... und später Referenz $foo. Offensichtlich sind solche Variablen jedoch in keiner Weise für den laufenden Code sichtbar.

    – Fataler Fehler

    23. April 2012 um 16:14 Uhr

  • Es ist nicht nur für die Inspektion. Sie können Variablenwerte in gdb ändern: stackoverflow.com/questions/3305164/…. delorie.com/gnu/docs/gdb/gdb_118.html. Sie können jedoch keine neuen Variablen deklarieren, soweit ich weiß.

    – Ding

    10. Februar 2014 um 7:55 Uhr


  • Beantwortet das deine Frage? GDB: Lokale Variable erstellen?

    – xhienne

    15. Januar 2021 um 12:13 Uhr

Benutzer-Avatar
Ilja Bobyr

Sie können Speicherplatz dynamisch zuweisen und zum Speichern einer neuen Variablen verwenden. Je nachdem, was Sie unter “Umfang der aktuellen Funktion” verstehen, ist dies möglicherweise nicht das, was Sie möchten.

Aber so sieht es aus, wenn Sie eine Funktion func() haben, die einen Zeiger auf einen Ausgabeparameter nimmt:

set $foo = malloc(sizeof(struct funcOutStruct))
call func($foo)
p *$foo
call (void) free($foo)

  • In meinem Fall anrufen func($foo) von gdb hat nicht funktioniert (Undefined command: "func".), aber anrufen set $garbage = func($foo) hat funktioniert. Außerdem musste ich verwenden malloc Anstatt von alloc.

    – nullromo

    2. Dezember 2018 um 22:40 Uhr

  • @nullromo Danke – Beispiel korrigiert, hinzugefügt call – Es führt einen Ausdruck aus und verwirft das Ergebnis. Und fest malloc.

    – Ilja Bobyr

    19. Dezember 2018 um 5:55 Uhr

  • Es scheint, dass Sie jetzt void umwandeln müssen, wenn eine Funktion wie z free wird verwendet wie in “` (gdb) call free(0) ‘free’ hat einen unbekannten Rückgabetyp; Wandeln Sie den Aufruf in seinen deklarierten Rückgabetyp um (gdb) call (void) free(0) “`

    – aitzkora

    2. August um 13:41 Uhr


  • @aitzkora Danke, aktualisierte Antwort. Was ist mit call func($foo) Teil? Es wäre seltsam, wenn gdb dort die Angabe eines expliziten Typs verlangen würde. Aber gleichzeitig ist mir unklar, warum es das für den brauchen würde free Anruf.

    – Ilja Bobyr

    3. August um 0:31 Uhr

  • Sie haben Recht, ich muss auch einen Cast (void) hinzufügen, um func($foo) aufzurufen, wenn diese Funktion keinen Rückgabetyp hat. Ich weiß nicht, ob es an meiner gdb-Implementierung liegt, aber es wird auch benötigt

    – aitzkora

    3. August um 9:28

Benutzer-Avatar
entspannen

Für C- (und wahrscheinlich C++-) Code wäre das sehr schwierig, da dies in den meisten Implementierungen das Verschieben des Stack-Zeigers beinhalten würde, was dazu führen würde, dass der Exit-Code der Funktion fehlschlägt, da er nicht mehr der Größe des Stack-Frames entspricht. Außerdem würde der gesamte Code in der Funktion, der auf lokale Variablen zugreift, plötzlich riskieren, an der falschen Stelle zu landen, was ebenfalls schlecht ist.

Also, ich glaube nicht, nein.

  • Genau genommen ist das richtig, es wäre mühsam, die Variablen auf den Stack zu bekommen. Aber wenn Sie mit statischen Variablen einverstanden sind, funktioniert Ilyas Lösung.

    – r_2

    16. Dezember 2018 um 23:46 Uhr

Benutzer-Avatar
jasonxiaole

So habe ich früher Variablen gedruckt

(gdb) set $path=((ngx_path_t     **)ngx_cycle->paths.elts)[2]
(gdb) print *$path
    $16 = {
        name = {
            len = 29,
            data = 0x80ed15c "/usr/local/nginx/fastcgi_temp"
            },
        len = 5,
        level = {1, 2, 0},
        manager = 0,
        loader = 0,
        data = 0x0,
        conf_file = 0x0,
        line = 0
    }

1372090cookie-checkWie deklariere ich eine Variable im Bereich einer bestimmten Funktion mit GDB?

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

Privacy policy