gdb ハッシュテーブル系 STL の要素を取り出す方法

std::unordered_map などの中身を取り出したい場合、gdb だと .at()operator[] では print できなかった。 では、特定 key の要素を取り出すにはどうすれば良いか

gdb には STL をいい感じに print してくれる拡張があり、ソースコードは python なので、中身を見るのも簡単そうである。

STLSupport - GDB Wiki

/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)