如何用gdb'迭代'std::unordered_set'中的元素;什么是Python API?

如何用gdb'迭代'std::unordered_set'中的元素;什么是Python API?,gdb,pretty-print,Gdb,Pretty Print,我有一个类,它的成员类型为std::unordered\u set。gdb为标准库中的类型提供了漂亮的打印机,包括std::unordered_set。打印一个包含7个元素的集合会返回如下结果 $50 = std::unordered_set with 7 elements = { [0] = 0x7fffffffb750, [1] = 0x7fffffffb330, [2] = 0x7fffffffaf10, [3] = 0x7fffffffaaf0, [4] = 0x7f

我有一个类,它的成员类型为
std::unordered\u set
。gdb为标准库中的类型提供了漂亮的打印机,包括
std::unordered_set
。打印一个包含7个元素的集合会返回如下结果

$50 = std::unordered_set with 7 elements = {
  [0] = 0x7fffffffb750,
  [1] = 0x7fffffffb330,
  [2] = 0x7fffffffaf10,
  [3] = 0x7fffffffaaf0,
  [4] = 0x7fffffffa6d0,
  [5] = 0x7fffffffa2b0,
  [6] = 0x7fffffffc490
}

我需要的是gdb python的API中的一种方法来重新实现这个漂亮的打印机,这样在迭代时,我可以从
SomeClass
返回“name”字段的值,而不是原始指针。然而,我似乎找不到正确的方法来迭代
无序集的bucket,并检索bucket中的各个节点。在中,有一个旧版本的实现给了我一些提示,但我不能正确地理解它。

结果表明,我们可以简单地为
std::unordered\u集导入漂亮的打印机,并使用自定义打印实现派生类

一种可能性是

从libstdcxx.v6.printers导入TR1UnderedSetPrinter
类UnorderedSetOfPointersPrinter(TR1UnderedSetPrinter):
定义初始值(self,val):
TR1UnderedSetPrinter.\uuuu init\uuuuu(self,str(val.type),val)
self.\u children=tr1UnderedSetPrinter.children(self)
自身指数=0
def儿童(自我):
对于idx,勇敢的孩子们:
收益率(idx,f'{valor.dereference()[“name”]}({valor}))
返回
问题是注册这台漂亮的打印机是为了我们的专业化
std::unordered\u set
。即使我们注册了这台漂亮的打印机,也会使用常规的
std::unordered_set
打印机来代替我们的新实现。(见附件)。一种解决方法是定义从
std::unordered_set
继承的新类型,例如

类MyUnorderedSetOfCyclassPointers:public std::unordered_set{};
然后为
MyUnorderedSetofMyCyclassPointers
注册漂亮的打印机。这是可行的,但并不理想,因为我们不必要地创建一个新类型只是为了帮助调试


最后,为
SomeClass*
实现一个漂亮的打印机是解决在
std::unordered_集
打印中只看到指针地址这一原始问题的最简单的解决方案,但是,如果您想/需要创建自定义命令来迭代
std::unordered_set
元素,那么了解如何定制gdb中已有的漂亮打印机仍然很有用。

您是否尝试过为
SomeClass*
创建漂亮的打印机?我为
SomeClass
创建了漂亮的打印机,但是,虽然您可以为类型创建漂亮的打印机,但我不确定您是否可以为指针注册一个。我记得我以前做过这件事,但没能成功。如果有人这样做过,我会再次尝试这种方法。我以前成功地这样做过。