首页 > 其他分享 >【gdb】让GDB支持STL的标准库的方法

【gdb】让GDB支持STL的标准库的方法

时间:2023-09-20 10:55:05浏览次数:37  
标签:STL gdb back python GDB vector printers push

 

本文源自http://sourceware.org/gdb/wiki/STLSupport

正常情况下,gdb没法直观的打印出stl标准库中的容器之类的,调试起来非常困难了。

vector,queue, deque, list等。

如vector<int> a

(gdb) p a

$1 = {<std::_Vector_base<int, std::allocator<int> >> = {
    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x804c008, _M_finish = 0x804c00c, 
      _M_end_of_storage = 0x804c00c}}, <No data fields>}

很不直观。。

 

原中介绍了3种方法:前两种方法我都用过。。

这里我强烈推荐第一种方法! 第一种方法最好用,支持c++11 STL中的所有容器,显示命令还是p

甚至是c++11中的shared_ptr也支持

方法:

1.用svn下载出一个python工具。

svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

完成后会在当前目录下得到一个名为python的目录 。

然后你可以将其移动到合适的地方,,比如移动到/home/yourname/lib/gdb_printers/目录下。

2.在打开文件/home/yourname/.gdbinit  即~/.gitinit文件。 若没有,则创建。

输入

 

python
import sys
sys.path.insert(0, '/home/yourname/lib/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

 

 

然后就完成了!!

使用情况如下:

(gdb) l
5  
6 int main()
7 {
8 vector<int> a;
9 a.push_back(3);
10 a.push_back(4);
11 a.push_back(5);
12 return 0;
13
14 }
(gdb) p a
$1 = std::vector of length 1, capacity 1 = {3}

就是这样的了。。非常易读。

c++11中的std::shared_ptr也支持。

 

对iterator的支持:

Breakpoint 1, main () at test.cpp:8
8 vector<int> a;
(gdb) n
9 a.push_back(3);
(gdb) 
10 a.push_back(4);
(gdb) 
11 a.push_back(5);
(gdb) 
12 vector<int>::iterator iter = a.begin();
(gdb) 
15 return 0;
(gdb) p iter
$6 = 3
(gdb) p *iter
$7 = (int &) @0x804c028: 3

参考资料

1. 

标签:STL,gdb,back,python,GDB,vector,printers,push
From: https://www.cnblogs.com/sunbines/p/17716743.html

相关文章

  • 【gdb】gdb attach
    gdbattachgdbattach的用法:#include<stdio.h>#include<thread>#include<queue>#include<mutex>#include<condition_variable>#include<chrono>namespace{classQueue{public: Queue()=default; ~Queue(){}......
  • C++ STL之向量vector
    /*vector_example.cpp*/#include<iostream>#include<vector>#include<string>usingnamespacestd;intmain(){vector<string>msg={"Hello","C++","World","from","VSCode"......
  • STL迭代器(iterator)
    http://c.biancheng.net/view/6675.html迭代器类别常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器 5种。 迭代器的定义方式尽管不同容器对应着不同类别的迭代器,但这些迭代器有着较为统一的定义方式,具体分为4种,如表1所示......
  • 在Linux系统中使用gdb调试一个代码
    首先我们知道在使用vs时,我们时可以通过调式一段代码来找出我们这段代码的逻辑错误在哪里的,但是在Linux中没有对应的图形化界面,我们应该怎么去调试一个代码呢?这里就需要使用道Linux中的一个工具叫做gdb。首先要检测你的操作系统中是否安装了gdb。检测安装gdb使用下面的指令gdb--ver......
  • gdb中的call命令
     gdb----使用call在任何位置直接执行函数 https://blog.csdn.net/ustc_sse_shenzhang/article/details/121006320 gdbcall跟踪函数 https://blog.csdn.net/qq_40008325/article/details/103465157 GDB秘技--调试时执行代码中的特定函数 https://blog.csdn.net/HorkyCh......
  • gdb的使用
    1、背景程序的发布方式有两种,debug模式和release模式Linuxgcc/g++编译出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项例如gcctest.c-omybin-g2、命令功能gdbbinFile(开始使用),ctrl+d或quit(退出)测试代码:调试命令:GDB中可以直接回车......
  • gdb相关
    命令                  命令缩写            命令说明setargs                               设置主程序的参数。break                  b              设置断点。run ......
  • C++STL进阶:pb_ds库
    Windows,64bitG++(ISOc20)stack=268435456开启O2优化万能头文件CodeForces在\(\ttC^{20(64)}_{++}\)版本下无法使用bits;如果需要使用priority_queue则无法使用using(会和std撞名字)。#include<bits/extc.h>usingnamespace__gnu_pbds;优先队列(不常用)概述......
  • 《STL源码剖析》 - 侯捷 2002年
    我们的第一个c++stlapplication。什么是容器?什么是迭代器?什么是算法?什么是分配器?什么是适配器?什么是仿函式?1.容器就是装数据的容器,等于是数据结构?不应该吧?数据结构不应该是自定义的吧?为什么说容器是数据结构搞不懂。2.分配器,用于给容器分配内存。3.迭代器,用于从容器中......
  • 合并果子题解-C++ STL priority_queue容器的使用
    说明:本博文关于priority_queue容器的说明来源于www.cnblogs.com/fusiwei/p/11823053.html本人是刚刚接触算法竞赛的萌新,如果有大佬发现了错误,还望指出(真的有人会看本蒟蒻的博文吗)这是我的第一篇博文,更多是作为测试以后会将博客作为笔记记录学习的体会基本概念priority_queu......