如何在GDB中解引用STL容器内非STL元素的指针
如何在GDB中解引用std::set里的智能指针成员
遇到这种情况挺常见的——std::set不支持随机访问(没有operator[]),而且begin()这类成员函数因为被编译器内联,GDB没法直接调用求值。下面给你两种可靠的方法,来解引用你std::set<MyIntrusivePtr<T>>容器里的m_p指针:
方法一:直接访问std::set的底层结构(适配GCC STL)
GCC的std::set底层基于红黑树实现,我们可以直接访问它的内部迭代器起始位置来获取元素:
- 先获取set中的第一个
MyIntrusivePtr<T>对象:
p *m_sSymbol->m_sVariables._M_t._M_impl._M_start
执行后会输出类似你之前看到的{m_p = 0x781a0630}的结果。
- 直接访问并解引用
m_p指针:
p *(*m_sSymbol->m_sVariables._M_t._M_impl._M_start).m_p
这条命令就能直接得到m_p指向的T类型对象的内容。
用你提供的示例代码验证
拿你给出的std::set<A>例子测试的话,命令如下:
# 获取第一个A对象 p *s._M_t._M_impl._M_start # 输出示例:$2 = {m_p = 0x7fffffffd484} # 解引用m_p指针 p *(*s._M_t._M_impl._M_start).m_p # 输出示例:$3 = 0(a是未初始化的int,值为随机值)
方法二:手动创建迭代器遍历(不依赖底层实现)
如果不想绑定到STL的底层结构细节,你可以手动创建迭代器来访问元素:
# 创建迭代器指向set的起始位置 set $it = s.begin() # 解引用迭代器获取元素 p *$it # 再解引用元素里的m_p指针 p *(*$it).m_p
注意:如果begin()函数被编译器内联了(比如开启了优化或者默认内联设置),GDB可能会提示Cannot evaluate function -- may be inlined,这时方法一的可靠性更高。
为什么常规方法失效?
p s[0]失败:std::set是有序关联容器,不支持随机访问,标准库没有为它实现operator[]。p (*s.begin())失败:begin()是轻量小函数,编译器默认会将其内联,GDB找不到对应的可执行代码来求值。
内容的提问来源于stack exchange,提问作者user8434768
相关产品推荐
相关产品推荐

