2012-12-14 7 views
7

ho un core dump e mi sto guardando il core dump con gdb.Come posso vedere un valore di boost :: qualsiasi se conosco il tipo con gdb

Mi chiedevo se c'è un modo per essere in grado di esaminare il valore di una spinta: qualsiasi valore in gdb?

Nel core, ho avuto l'indirizzo di boost any e quindi ho provato a trasmetterlo a un segnaposto per vedere se potevo esaminare il valore, ma mi è venuto meno. So che il tipo di boost any è unsigned long quindi c'è un modo per visualizzare qualsiasi valore conoscendo il tipo?

(gdb) print ('boost::any::placeholder')(*(('boost::any'*)0x00007f263fa27730).content) 
warning: can't find linker symbol for virtual table for `boost::any::placeholder' value 
warning: found `boost::any::holder<bool>::~holder()' instead 
$129 = warning: can't find linker symbol for virtual table for `boost::any::placeholder' value 
warning: found `boost::any::holder<bool>::~holder()' instead 
warning: can't find linker symbol for virtual table for `boost::any::placeholder' value 
warning: found `boost::any::holder<bool>::~holder()' instead 
{ 
    _vptr.placeholder = 0x7f2a9a662560 
} 

Qualsiasi aiuto con questo argomento sarebbe molto apprezzato. Grazie!

+1

Hai guardato l'aumento di qualsiasi fonte? Un impulso qualsiasi contiene un puntatore ad un titolare, il cui tipo bambino è basato su modelli dal tipo tenuto, se non ricordo male. L'aumento di se stesso non è un tipo dinamico, possiede un tipo dinamico. – Yakk

+1

Mi chiedo se si possa scrivere una stampante gdb pretty per 'boost :: any'. Dopotutto, non è nemmeno necessario conoscere il tipo di contenuto, dal momento che il puntatore 'vtable' del tipo tenuto sa quale sia il tipo di contenuto. Abbiamo bisogno di più stampanti gdb pretty! – enobayram

risposta

1

boost::any ha una classe interna placeholder che contiene il contenuto dei dati. Prova a utilizzare:

(gdb) print (*((boost::any::holder<unsigned long>*)((anyInstance).content))).held