GDB使用gdb-stl-views打印STL容器元素

56 篇文章 3 订阅

简介

使用gdb调试C++程序时,无法使用命令p 变量名输出STL容器的元素数据。例如有一个std::vector<int> datas变量, 执行p datas,输出如下:

(gdb) p datas     
$2 = {
  <std::_Vector_base<int, std::allocator<int> >> = {
    _M_impl = {
      <std::allocator<int>> = {
        <__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, 
      members of std::_Vector_base<int, std::allocator<int> >::_Vector_impl: 
      _M_start = 0x606010, 
      _M_finish = 0x60601c, 
      _M_end_of_storage = 0x606020
    }
  }, <No data fields>}

可以使用一个名为gdb-stl-views的小工具,下载完成后,将其改名为.gdbinit并放置到home目录下,然后再执行输出STL容器内容的新命令,对于std::vector,执行pvector datas,输出信息如下:

(gdb) pvector datas
elem[0]: $3 = 1
elem[1]: $4 = 2
elem[2]: $5 = 3
Vector size = 3
Vector capacity = 4
Element type = std::_Vector_base<int, std::allocator<int> >::pointer

新命令

对于STL的各种容器,输出其元素的命令如下:

容器类型GDB 命令
std::vectorpvector
std::listplist
std::mappmap
std::multimappmap
std::setpset
std::multisetpset
std::dequepdeque
std::stackpstack
std::queuepqueue
std::priority_queueppqueue

对于std::vector,输出命令为pvector 变量名,而对于std::map,输出命令为pmap 变量名 键类型 值类型,就需要给出除变量之外的其他信息。

要查看某一个命令的所有用法,可以使用命令help 命令。例如使用help pmap,可以得到如下信息:

(gdb) help pmap
	Prints std::map<TLeft and TRight> or std::multimap<TLeft and TRight> information. Works for std::multimap as well.
	Syntax: pmap <map> <TtypeLeft> <TypeRight> <valLeft> <valRight>: Prints map size, if T defined all elements or just element(s) with val(s)
	Examples:
	pmap m - prints map size and definition
	pmap m int int - prints all elements and map size
	pmap m int int 20 - prints the element(s) with left-value = 20 (if any) and map size
	pmap m int int 20 200 - prints the element(s) with left-value = 20 and right-value = 200 (if any) and map size

参考

GDB中查看STL容器类的内容
在linux用gdb查看stl中的数据结构

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值