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

news/发布时间2024/5/19 21:30:23

 

本文源自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. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/51656781.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Windows NTP 时间同步设置

不知道为啥服务器跑着跑着时间总慢一点…服务器能联网,自动和 ms 的时间服务同步但默认同步周期太长,一周同步一次…更改注册表:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient]下的 SpecialPollInterval默认为 604800 (60 * 60 …

读高性能MySQL(第4版)笔记11_查询性能优化(中)

查询性能优化1. MySQL的客户端/服务器通信协议 1.1. MySQL的客户端和服务器之间的通信协议是“半双工”的 1.2. 在任何时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器发送数据,这两个动作不能同时发生 1.3. 当查询的语句很长的时候,参数max_allowed_packet就…

Python 通过 stomp 发送消息到 ActiveMQ 的代码

只需要下面简单的几行代码,我们就可以把我们本地数据发送到 ActiveMQ 上面去。 def send_mq(data):hosts = [(AMQHOST, AMQPORT)]conn = stomp.Connection(host_and_ports=hosts, auto_content_length=False)conn.connect(username=AMQUSER, passcode=AMQPASS, wait=True)conn…

Selenium python 代码运行的时候提示 no attribute find_element_by_xpath

我们有下面的一行代码,运行测时候提示没有特定的属性。 Name = kuch bhi last = test.find_element_by_xpath(//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input) last.send_keys(Name)问题和解决 根据官方的修改记录,* Dep…

2023软件工程作业02

以五个月为一个周期的学习计划: 如果我真想学习并从事汽车自动驾驶相关的技术,那么我不应该计划现阶段学习。 因为我现在的本科学校的含金量不支持我从事这个行业,我能踏入这个行业的敲门砖应该是一个较好大学的研究生学历。 那么学习计划就转变为了考研计划。 明年11月左右…