Manipulieren von C ++ - Membervariablen, die in GDB mit $ beginnen

9

Ich arbeite mit einer C ++ - Codebasis mit einem sehr speziellen Codierungsstil, einschließlich der Präfix-Membervariablen in Klassen mit '$'. Für alle, die noch nie zuvor darauf gestoßen sind, gehört es nicht offiziell zu C ++ - Standards, aber lauert herum für die Rückwärtskompatibilität .

Als ein Beispiel von dem, worüber ich spreche:

%Vor%

Dies führt zu einem Problem in GDB. GDB verwendet normalerweise $ Präfix-Variablen als eine magische Bequemlichkeitsvariable (wie zum Beispiel Bezug auf vorherige Werte). Feuern Sie GDB hoch, setzen Sie einen Haltepunkt bei der Anweisung cout und versuchen Sie, t->$x zu drucken.

p t läuft gut. p *t läuft gut. p t->y läuft gut. p t->$x gibt einen Syntaxfehler zurück und erwartet vermutlich, dass $ auf eine Convenience-Variable verweist.

Im Idealfall würde ich die $ s ganz aus dem Verkehr ziehen und den Rest meiner Tage damit verbringen, jemanden zu jagen, der das für eine gute Idee hielt (besonders für eine moderne Codebasis). Das ist nicht realistisch, aber ich muss immer noch in der Lage sein, GDB zum Debuggen zu verwenden.

Ich hoffe, dass es einen magischen Fluchtcharakter gibt, aber nichts, was ich gesucht oder versucht habe, hat funktioniert.

Beispiele:

  • p this->'4descriptor'
  • p this->'$descriptor'
  • p this->'$'descriptor
  • p this->$descriptor
  • p this->\$descriptor
  • p this->'$descriptor'
  • p this->'\044descriptor'
  • p this->$$descriptor
  • p this->'$$descriptor'

und so weiter.

In diesem speziellen Fall kann ich die Getter-Funktion ( p this->getDescriptor() ) ausführen. Ein hässlicherer Workaround ist das Drucken des gesamten Klasseninhalts ( p *this ). Ich bin mir nicht sicher, ob ich mich auf beide auf unbestimmte Zeit verlassen kann; Einige der Klassen sind ziemlich groß, und die meisten Membervariablen haben keine Getter.

Dies könnte möglicherweise als ein Fehler in GDB klassifiziert werden, abhängig davon, ob es eine gute Idee ist, Eingaben zu rippen, um dies zu unterstützen. Aber selbst wenn es behoben wurde, bleibe ich bei GDB 7.2 für die gegebene Architektur / Build-Umgebung hängen.

Irgendwelche Ideen?

UPDATE: python import gdb; print (gdb.parse_and_eval("t")['$x']) wie im Kommentar vorgeschlagen, funktioniert, wenn Sie Python eingebaut haben (was ich leider nicht habe).

    
SirNuke 13.05.2015, 19:17
quelle

1 Antwort

1

Wenn Sie die gdb-Version mit Python-Erweiterungen haben, hilft vielleicht die "explore" -Funktion.

Siehe Ссылка

%Vor%

Da Sie den Variablennamen nicht benötigen, sollten Sie in der Lage sein, das Problem '$' zu umgehen.

    
narz 14.05.2015 13:56
quelle

Tags und Links