【gdb】支持打印STL标准库容器

支持STL的标准库的方法

1. 测试示例:

#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> vec(10);
  for (int i = 0; i < vec.size(); i++)
    vec[i] = i;

  cout << "vec contains:";
  for (int i = 0; i < vec.size(); i++)
    cout << ' ' << vec[i];
  cout << '\n';

  return 0;
}

在gdb中,如果要打印C++ STL容器的内容,缺省的显示结果可读性很差:

(gdb) p vec
$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 = 0x404010, _M_finish = 0x404038, 
          _M_end_of_storage = 0x404038}}, <No data fields>}

gdb 7.0之后,可以使用gcc提供的python脚本,来改善显示结果:

(gdb) p vec
$1 = std::vector of length 10, capacity 10 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

方法:

1.用svn下载出一个python工具,会在当前目录下得到一个名为python的目录。可以如移动到/home/yourname/lib/gdb_printers/目录:

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

 

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

 

 

参考资料

1. 支持STL的标准库的方法

2. 打印STL容器中的内容

 

posted @ 2023-09-20 10:49  苏格拉底的落泪  阅读(212)  评论(0编辑  收藏  举报