每天学点GDB(五)

简介: 本节分享使用GDB来进行STL容器的调试。

使用GDB来进行STL容器的调试

现代C++中STL使用的越来越普遍,较之其它类型,stl容器类的调试显得复杂度更好。本篇以map为例说明如何利用gdb来遍历map中的各成员变量。

源码如下:

#include <map>
#include <iostream>
#include <string>

using namespace std;

int main(int arg, char** argv) {
  map<int, string> mapExample;
  mapExample.insert(pair<int,string>(1,"demo_one"));
  mapExample.insert(pair<int,string>(2,"demo_two"));
  mapExample.insert(pair<int,string>(3,"demo_three"));
  map<int,string>::iterator iter;
  for ( iter = mapExample.begin();iter!=mapExample.end();iter++) {
    cout<<iter->second<<endl;
  }
  return 0;
}

编译运行:

g++ -o demo -g stl_test.cpp

运行

gdb ./demo
br 14
r

显示mapExample容器中的各个元素

p mapExample
$1 = std::map with 3 elements = {[1] = "demo_one", [2] = "demo_two", [3] = "demo_three"}

如果想要知道每个element的所在的内存区域,需要先得到stl map的类型。

ptype mapExample

显示如下,成员函数部分略去。

type = class std::map<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<int>, std::allocator<std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > [with _Key = int, 
         _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Compare = std::less<int>, 
         _Alloc = std::allocator<std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >] {
  private:
    _Rep_type _M_t;

至此关键性成员变量显示即_M_t

顺着这条思路继续往下,查看_M_t的结构定义

p mapExample._M_t

结果显示出stl map实现使用了红黑二叉树rb-tree

  _M_impl = {
    <std::allocator<std::_Rb_tree_node<std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {
      <__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<No data fields>}, <No data fields>}, 
    members of std::_Rb_tree<int, std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<int>, std::allocator<std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_Rb_tree_impl<std::less<int>, false>: 
    _M_key_compare = {
      <std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, 
    _M_header = {
      _M_color = std::_S_red, 
      _M_parent = 0x6040b0, 
      _M_left = 0x604040, 
      _M_right = 0x604120
    }, 
    _M_node_count = 3
  }
}

至此,事情变的简单了,利用_M_left和_M_right就可以遍历各个二叉树结点了。

手工方式作一次不会觉着很累,但次次都手工查看会觉着不厌其烦。幸运的是,早有人已经提供了自动化的脚本。具体链接如下

https://gist.github.com/skyscribe/3978082

使用方法是将上述链接中的内容保存到~/.gdbinit中,如果没有.gdbinit就手工创建一个,该文件在gdb每次启动时会被最先读入。

有了上述脚本,就可以用plist, pmap, pvector来遍历stl容器了。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
算法 Unix
socket套接字选项getsockopt&setsockopt
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项。getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
588 0
|
存储 安全 Shell
Git clone 克隆私有项目
Git clone 克隆私有项目
Git clone 克隆私有项目
|
人工智能 监控 数据挖掘
AiPy发布第五期大模型适配度测评报告:Claude、GLM、豆包位居前三,美团LongCat落后
10月13日,AiPy发布《大模型适配度测评第五期报告》,覆盖20款国内外主流大模型,聚焦数据分析、编程开发、UI设计等十大真实场景。报告从成功率、资源消耗、速度等多维度综合评估,Claude-Sonnet-4以90%成功率位居榜首,GLM-4.5、Doubao-Seed-1.6等国产模型表现亮眼,展现中国AI技术进步。测评发现代码质量、中文支持、任务规划仍是主要挑战,为用户选型与模型优化提供重要参考。
|
NoSQL IDE MongoDB
Studio 3T 2025.11 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
Studio 3T 2025.11 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
720 3
|
10月前
IDEA标签窗口好行显示 类注释和方法注释
IDEA标签窗口好行显示 类注释和方法注释
528 4
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
493 2
|
安全 网络协议 Shell
Github代码仓库SSH配置流程
这篇文章是关于如何配置SSH以安全地连接到GitHub代码仓库的详细指南,包括使用一键脚本简化配置过程、生成SSH密钥对、添加密钥到SSH代理、将公钥添加到GitHub账户以及测试SSH连接的步骤。
1564 0
Github代码仓库SSH配置流程
|
Shell
Shell while 语法(: 死循环)
Shell while 语法(: 死循环)
705 0
|
机器学习/深度学习 边缘计算 缓存
有哪些方法可以降低 LLM 的计算成本?
【8月更文挑战第13天】
777 5
|
Prometheus Kubernetes 监控
在K8S中,如何排查与解决Pod频繁重启的问题?
在K8S中,如何排查与解决Pod频繁重启的问题?