2012-12-14 7 views
7

Mam zrzut główny i patrzę na zrzut główny z gdb.Jak mogę zobaczyć wartość boost :: any, jeśli znam typ z gdb

Zastanawiam się, czy istnieje sposób, aby móc zbadać wartość boost :: jakąś wartość w gdb?

W rdzeniu miałem adres do wzmocnienia, więc próbowałem rzucić go na symbol zastępczy, aby sprawdzić, czy mogę sprawdzić wartość, ale nie udało mi się. Wiem, że typ boostu jest niepodpisany długo, więc czy istnieje sposób na zobaczenie jakiejkolwiek wartości znającej typ?

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

Każda pomoc w tej sprawie byłaby bardzo doceniana. Dzięki!

+1

Czy przyjrzeliście się boostowi z dowolnego źródła? Podsumowanie doładowania zawiera wskaźnik do posiadacza, którego typ dziecka jest szablonem na typie trzymanym, jeśli dobrze pamiętam. Samowolne zwiększenie nie jest typem dynamicznym, posiada typ dynamiczny. – Yakk

+1

Zastanawiam się, czy można napisać ładną drukarkę gdb dla 'boost :: any'. W końcu nie musisz nawet znać typu zawartości, ponieważ wskaźnik 'vtable' przechowywanego typu wie, jaki jest typ zawartości. Potrzebujemy więcej ładnych drukarek gdb! – enobayram

Odpowiedz

1

boost::any ma klasę wewnętrzną placeholder, która przechowuje zawartość danych. Spróbuj użyć:

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