2012-12-14 14 views
7

Ich habe einen Core Dump und ich schaue auf den Core Dump mit Gdb.Wie kann ich einen Wert von boost :: any sehen, wenn ich den Typ mit gdb kenne

Ich frage mich, ob es eine Möglichkeit gibt, den Wert eines boost :: any-Wertes in gdb zu untersuchen?

Im Kern hatte ich die Adresse, um den Boost irgendwelcher und so versuchte ich, es auf einen Platzhalter zu werfen, um zu sehen, ob ich den Wert untersuchen könnte, aber ich habe mich geschlagen. Ich weiß, dass der Typ des Boosts beliebig lange nicht signiert ist, also gibt es eine Möglichkeit, den Wert zu sehen, der den Typ kennt?

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

Jede Hilfe mit dieser Angelegenheit würde sehr geschätzt werden. Vielen Dank!

+1

Haben Sie den Boost Quelle angeschaut? Ein Boost Any enthält einen Zeiger auf einen Halter, dessen Kindtyp auf den gehaltenen Typ eingestellt ist, wenn ich mich richtig erinnere. Der Boost selbst ist kein dynamischer Typ, er besitzt einen dynamischen Typ. – Yakk

+1

Ich frage mich, ob man einen gdb hübschen Drucker für 'boost :: any' schreiben könnte. Schließlich müssen Sie nicht einmal den Typ des Inhalts kennen, da der 'vtable'-Zeiger des gehaltenen Typs weiß, was der Inhaltstyp ist. Wir brauchen mehr gdb hübsche Drucker! – enobayram

Antwort

1

boost::any hat eine interne Klasse placeholder, die den Dateninhalt enthält. Versuchen Sie mit:

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