每天学点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
目录
相关文章
|
7月前
|
Linux 编译器 C语言
Linux应用开发基础知识——Makefile 的使用(二)
Linux应用开发基础知识——Makefile 的使用(二)
313 0
Linux应用开发基础知识——Makefile 的使用(二)
|
7月前
|
Linux 编译器 C语言
《Linux从练气到飞升》No.05 Linux编译器gcc/g++的使用及编译过程 【云边有个小卖部】上新
《Linux从练气到飞升》No.05 Linux编译器gcc/g++的使用及编译过程 【云边有个小卖部】上新
165 0
|
7月前
|
机器学习/深度学习 存储 NoSQL
【Linux系统编程】代码调试工具gdb--2
【Linux系统编程】代码调试工具gdb--2
|
7月前
|
机器学习/深度学习 NoSQL Linux
【Linux系统编程】代码调试工具gdb--1
【Linux系统编程】代码调试工具gdb--1
|
7月前
|
NoSQL IDE Linux
《Linux从练气到飞升》No.09 Linux调试器-gdb使用
《Linux从练气到飞升》No.09 Linux调试器-gdb使用
60 0
《Linux从练气到飞升》No.09 Linux调试器-gdb使用
|
测试技术 Go 网络安全
听说还不知道这几个 Goland 技巧
很多人使用 Goland 有很长时间的,却没有好好利用上 Goland 工具带给我们的遍历,今天咱们就来解锁一下新技巧
146 0
|
NoSQL Linux 编译器
Linux工具学习之【gdb】
vim 可以编写代码,gcc/g++ 可以编译代码,此时只最后一件神器,就能进行完整的开发工作,那就是通过 gdb 调试代码,毕竟谁都不敢保证自己的代码没有问题,所以就有调试器这种东西帮助我们定位问题,进而解决问题
215 0
Linux工具学习之【gdb】
|
安全 数据安全/隐私保护 Windows