2015-05-13 15 views
9

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).

+1

la compabilità all'indietro è malvagia, vero? – user463035818

+0

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. –

+0

Hai provato a usare '$$' per evitarlo? – sehe

risposta

1

Se hai la versione gdb con estensioni python, forse la funzione "esplora" ti sarà d'aiuto.

Vedi https://sourceware.org/gdb/onlinedocs/gdb/Data.html#Data


    (gdb) explore cs 
    The value of `cs' is a struct/class of type `struct ComplexStruct' with 
    the following fields: 

     ss_p = 
     arr = 

    Enter the field number of choice: 

Dal momento che non è necessario il nome della variabile, si dovrebbe essere in grado di passo intorno al problema '$'.

Problemi correlati