gdb调试stl

来源:互联网 发布:御马脚垫 知乎 编辑:程序博客网 时间:2024/05/20 12:24

用gdb 调试如下代码时:


map<int, int> m;

m[1] = 2;

m[3] = 3;


(gdb) p m[1]

Attempt to take address of value not located in memory.


(gdb) m.find(1) 或者 m.size()

Cannot evaluate funtion -- may be inlined


调用size 或find 出错是因为代码中没有调用size, find方法,  模板方法只有在程序中调用以后才能在gdb中调用。

gdb 对没有对stl的支持,print m 以后得不到什么有用的信息。


解决以上问题我目前发现了两种方法:

1: 定义gdb 宏

http://sourceware.org/ml/gdb/2008-02/msg00064/stl-views.gdb

把上面文件内容粘贴到.gdbinit或者在.gdbinit中包含该文件, 就可以用定义的命令调试stl 了。

该方法优点: 使用较为简单

缺点:该宏只能支持c++内置基本类型,对于复杂类型没有支持; 与stl版本有关, 有可能出现语法错误; 



2: 程序中编写测试代码

void test(.....) {

     cout << .....

}

然后在gdb 中 print test(..) 或者 call test(...)

就可以显示stl内容了。


优点: 调试功能比较全面, 可以调试任意复杂类型

缺点: 编写测试代码较为麻烦 ; 对core-dump无法使用


另外网上提供了一些python 和perl的工具也可以扩展gdb对stl的支持。



调试iterators时, 如果类型是基本类型, 可以用print *(iter._M_current) 观察迭代器指向内容


0 0
原创粉丝点击