最近のgcc+gdbはstd::mapをprintすると
(gdb) p m $1 = std::map with 3 elements = {[1] = 1, [2] = 4, [3] = 9}
というふうにプリティプリントしてくれる。これまではメンバ変数が丸見えになるだけで、内容はわからなかった。
(gdb) p m $1 = {_M_t = { _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const int, int> > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const int, int> > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, _M_header = { _M_color = std::_S_red, _M_parent = 0x801407070, _M_left = 0x801407040, _M_right = 0x8014070a0}, _M_node_count = 3}}}
gdbをpythonありでコンパイルすると有効になり、本体は私の環境だと/usr/local/share/gcc-4.7.0/python/libstdcxx/v6/printers.pyにあった。適当に中身を見ると以下のクラスをサポートしているようだ。
__gnu_cxx::_Slist_iterator __gnu_cxx::__normal_iterator __gnu_cxx::slist __gnu_debug::_Safe_iterator std::_Deque_const_iterator std::_Deque_iterator std::_List_const_iterator std::_List_iterator std::_Rb_tree_const_iterator std::_Rb_tree_iterator std::__debug::bitset std::__debug::deque std::__debug::list std::__debug::map std::__debug::multimap std::__debug::multiset std::__debug::priority_queue std::__debug::queue std::__debug::set std::__debug::stack std::__debug::unique_ptr std::__debug::unordered_map std::__debug::unordered_multimap std::__debug::unordered_multiset std::__debug::unordered_set std::__debug::vector std::__norm::_Deque_const_iterator std::__norm::_Deque_iterator std::__norm::_List_const_iterator std::__norm::_List_iterator std::basic_string std::bitset std::deque std::list std::map std::multimap std::multiset std::priority_queue std::queue std::set std::shared_ptr std::stack std::tr1::shared_ptr std::tr1::unordered_map std::tr1::unordered_multimap std::tr1::unordered_multiset std::tr1::unordered_set std::tr1::weak_ptr std::tuple std::unique_ptr std::unordered_map std::unordered_multimap std::unordered_multiset std::unordered_set std::vector std::weak_ptr