Sto lavorando con una base di codice C++ con uno stile di codifica molto particolare, incluso il prefisso delle variabili membro nelle classi con '$'. Per chiunque non si sia mai visto prima, non è formalmente parte degli standard C++, ma è lo lurks around for backwards compatibility.
Per fare un esempio di quello che sto parlando:
#include <iostream>
class T { public: int $x; int y; };
int main()
{
T *t = new T();
t->$x = t->y = 42;
std::cout << "t->$x = " << t->$x << std::endl;
delete t;
return 0;
}
Questo introduce un problema in GDB. GDB utilizza normalmente variabili prefissate $ come variabile di convenienza magica (come ad esempio riferimenti a valori precedenti). Accendi GDB, imposta un breakpoint nell'istruzione cout e prova a stampare t->$x
.
p t
funziona correttamente. p *t
funziona correttamente. p t->y
funziona correttamente. p t->$x
restituisce un errore di sintassi, presumibilmente si aspetta che il $ faccia riferimento a una variabile di convenienza.
Idealmente, mi piacerebbe spogliare completamente i $ s e passare il resto dei miei giorni a scovare chiunque pensasse che fosse una buona idea (specialmente per una base di codice moderna). Non è realistico, ma devo ancora essere in grado di utilizzare GDB per il debug.
Spero ci sia un personaggio di fuga magica, ma non ha funzionato nulla che ho cercato o provato.
Esempi:
p this->'\044descriptor'
p this->'$descriptor'
p this->'$'descriptor
p this->\$descriptor
p this->\\$descriptor
p this->'\$descriptor'
p this->'\\044descriptor'
p this->$$descriptor
p this->'$$descriptor'
e così via.
In questo caso particolare, è possibile eseguire la funzione getter (p this->getDescriptor()
). Una soluzione più brutta è stampare l'intero contenuto della classe (p *this
). Non sono sicuro di poter fare affidamento su entrambi questi indefinitamente; alcune delle classi sono abbastanza grandi e la maggior parte delle variabili membro non ha getter.
Questo potrebbe potenzialmente essere classificato come un bug in GDB, a seconda che sia una buona idea ritagliare l'input per supportarlo. Tuttavia, anche se è stato risolto, sono bloccato su GDB 7.2 per l'architettura data/ambiente di costruzione.
Qualche idea?
AGGIORNAMENTO: python import gdb; print (gdb.parse_and_eval("t")['$x'])
come suggerito nel commento funziona se si dispone di python incorporato (che non ho, purtroppo).
la compabilità all'indietro è malvagia, vero? – user463035818
Il code base è mantenuto attivamente su un repository come github? Potrebbe essere ripulito nel codice sorgente, magari aggiornato sul repository, oppure potresti forarlo e ripulirlo? Se sei bloccato con GDB che inciampa su questo, quella potrebbe essere la tua migliore opzione ... anche se conta il costo in ore per farlo. –
Hai provato a usare '$$' per evitarlo? – sehe