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?
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?
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
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
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
}
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