2012-04-23 5 views
17

Ich weiß, dass gdb ermöglicht eine bereits deklarierte Variable gesetzt mit dem set Befehl.Wie deklariere ich eine Variable im Rahmen einer gegebenen Funktion mit GDB?

Kann gdb dynamisch eine neue Variable innerhalb des Bereichs einer bestimmten Funktion deklarieren?

+10

Was würde es tun? Der Code wäre sich seiner Existenz nicht bewusst. –

+0

Stimmen Sie mit @JamesMcLaughlin trotzdem überein, um klar zu sein: ** nein **, es ist nur für die Inspektion. –

+6

Sind Sie sicher, dass Sie keine gdb-Variable möchten? Sie * können * Variablen im Kontext von gdb erstellen, wie 'set $ foo = ...' und später auf '$ foo' verweisen. Offensichtlich sind solche Variablen für den laufenden Code jedoch in keiner Weise sichtbar. – FatalError

Antwort

14

Für C (und wahrscheinlich C++) Code wäre das sehr schwierig, da dies in den meisten Implementierungen das Verschieben des Stackpointers mit sich bringen würde, was dazu führen würde, dass der Exitcode der Funktion fehlschlägt, da er nicht mehr der Größe des Stapelrahmen. Auch würde der gesamte Code in der Funktion, der auf lokale Variablen zugreift, plötzlich riskieren, den falschen Ort zu treffen, was ebenfalls schlecht ist.

Also, ich denke nicht, nein.

6

das ist, wie ich verwendet, um Variablen drucken

(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 
    } 
12

Sie dynamisch etwas Platz zuweisen kann und es verwenden, eine neue Variable zu speichern. Abhängig davon, was Sie unter "Umfang der aktuellen Funktion" verstehen, ist es möglicherweise nicht das, was Sie wollen.

Aber hier ist, wie es aussieht, wenn Sie Funktion func haben(), die einen Zeiger auf einen Ausgabeparameter nimmt:

set $foo = alloc(sizeof(struct funcOutStruct)) 
func($foo) 
p *$foo 
free($foo)