std::unordered_map などの中身を取り出したい場合、gdb だと .at()
や operator[]
では print できなかった。
では、特定 key の要素を取り出すにはどうすれば良いか
gdb には STL をいい感じに print してくれる拡張があり、ソースコードは python なので、中身を見るのも簡単そうである。
/usr/share/gcc-xxx/python/libstdcxx/v6/printers.py
class Tr1HashtableIterator(Iterator): def __init__ (self, hash): self.node = hash['_M_bbegin']['_M_node']['_M_nxt'] self.node_type = find_type(hash.type, '__node_type').pointer() def __iter__ (self): return self def __next__ (self): if self.node == 0: raise StopIteration node = self.node.cast(self.node_type) result = node.dereference()['_M_v'] self.node = node.dereference()['_M_nxt'] return result
なるほど、 _M_bbegin
→ _M_node
→ _M_nxt
とフィールドをたどると node が取り出せるらしい。
そして次の要素にいくには、 _M_nxt._M.nxt. ...
と繋いでいくとよいみたい。
そして、 たとえば std::unordered_map であれば、 _M_h
フィールドに hashtable があるので
(gdb) print *(value_type*)(unordered_map._M_h_._M_bbegin._M_node._M_nxt)