2012-12-14 42 views
7

我有一个核心转储,我正在用gdb查看核心转储。如何知道boost :: any的值如果我知道gdb的类型

我想知道是否有办法能够检查gdb中boost :: any值的值吗?

在核心,我有地址的提升任何和所以我试图将它转换为占位符,看看我是否可以检查的价值,但我倒下了。我知道boost的类型是无符号的,所以有什么方法可以查看知道类型的任何值?

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

任何有关此事的帮助将不胜感激。谢谢!

+1

你看过提升任何来源?如果我记得正确,任何一个boost都包含一个指向持有者的指针,其持有者的子类型是模板化的。 boost本身不是一个动态类型,它拥有一个动态类型。 – Yakk

+1

我不知道是否可以为'boost :: any'写一个gdb漂亮的打印机。毕竟,你甚至不需要知道内容的类型,因为持有类型的'vtable'指针知道内容类型是什么。我们需要更多gdb漂亮的打印机! – enobayram

回答

1

boost::any有一个内部类placeholder它保存数据内容。尝试使用:

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