用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) 观察迭代器指向内容