博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

eclipse中gdb调试输出stl容器的内容

Posted on 2013-01-07 18:54  开源云  阅读(1970)  评论(1编辑  收藏  举报

在eclipse中安装cdt插件写c++代码时常用到gdb调试
但是对于vector,map等等stl中内容,调试时只能显示开始和结束时的地址信息,非常不友好。

研究了老一阵子,终于配置成功了,下边介绍下配置细节,以留大家参考。

1.用svn下载svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
2.官网说这个printer有个bug。打开之前检出的文件夹,在python/libstdcxx/v6下找到printers.py并打开, 找到第614行,在之后加入如下红色代码

len = header.dereference ()['_M_length']
if len>100:
    len=100 #此处值可做修改
if hasattr(ptr, "lazy_string"):

3.在你的用户路径下创建.gdbinit,我用的是root用户,所以创建的文件为/root/.gdbinit,里边内容为

python
import sys
sys.path.insert(0, '/root/python')
from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers (None)
end
4.下载gdb

如果此时用gdb调试能够正常显示stl,则跳过此步。

我用的是centos5.5,gdb是7.0版的,似乎不支持,所以下载了最新的7.5,需要安装python2.6版本,2.4不能用,其它版本没有尝试。我用的是2.6.5。下载源码包通过编译安装。

dgb下载路径http://mirror.bjtu.edu.cn/gnu/gdb/ 。

编译方式:

LDFLAGS=-L/usr/lib ./configure --with-python
make

我直接将编译出来的gdb替换了原来的/usr/bin/gdb,大家可以把原来的gdb留个备份。

5.命令行测试

源码:

#include <vector>
using namespace std;

int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
return 0;
}

用gdb调试得出vec结果为:

$1 = std::vector of length 3, capacity 4 = {1, 2, 3}

6.配置eclipse

官方给出的是在Window->preferences->C/C++->Debug->GDB中进行修改。刚开始我的环境中没有,后来发现是因为eclipse之前没有使用过调试功能,先将代码进行一次调试。之后再去看GDB选项有了。

这里需要配置的只有一项,就是GDB command file,我配置的是/root/.gdbinit,可根据自己实际情况填写。

另外如果没有替换原有的gdb,则上方的GDB debugger也需要修改为编译好的gdb路径。

再次运行eclipse调试,stl可以正常显示了。

这里还需要注意一点,之前配置的调试选项也需要修改,因为preferences配置的选项是之后生效,之前配置的选项还是老的。修改的跟之前配置一样就可以啦。