core文件中的几个字段含义



 class Dialog{

      typedef std::map<int, SharedPtr<SipMessage> > RequestMap;
      RequestMap mRequests;
}

在GDB中找出来mRequests是这样的:


 (gdb) p this
$22 = (resip::Dialog * const) 0x2aaab0784a80
(gdb) p this->mRequests
$23 = {_M_t = {
    _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<int const, resip::SharedPtr<resip::SipMessage> > > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, resip::SharedPtr<resip::SipMessage> > > >> = {<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 = _S_red, 
        _M_parent = 0x0, _M_left = 0x2aaab0785a20, _M_right = 0x2aaab0785a20}, _M_node_count = 0}}}

我想问的是
_M_left = 0x2aaab0785a20, _M_right = 0x2aaab0785a20
*_M_left*的内容代表什么,有没有办法查看mRequest的内容?

coredump gdb

雾雨店D魔理沙 9 years, 11 months ago

由于 map 实际上是一个 tree,特别是 operator [] 这种便利的重载在 core dump 中不可用,所以你要想看 map 里面的内容,就需要顺着 tree 一个个的节点去找,略蛋疼。

你可以参考 gcc 的标准库实现来了解各个字段的含义,比如:

另外,网上有人推荐使用 一个 gdb 脚本 来解决这个蛋疼的事情,不过我没有用过,你可以尝试一下,或许会很有帮助。

空气化的H音 answered 9 years, 11 months ago

Your Answer