用gdb检查标准容器(std :: map)的内容
假设有这样的事情:
#include <map> int main(){ std::map<int,int> m; m[1] = 2; m[2] = 4; return 0; }
我希望能够从gdb中检查运行该程序的地图的内容。
如果我尝试使用下标运算符,我会得到:
(gdb) pm[1] Attempt to take address of value not located in memory.
使用find方法不会产生更好的结果:
(gdb) p m.find(1) Cannot evaluate function -- may be inlined
有没有办法做到这一点?
我认为没有,至less不是如果你的源优化等。但是,有一些macros可以检查STL容器为您的gdb:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
但是,我不使用这个,所以YMMV
这个问题的现有答案已经过时了。 最近的GCC和GDB的Just Work TM得益于GDB 7.x中的内置Python支持和GCC附带的libstdc ++漂亮的打印机。
对于OP的例子,我得到:
(gdb) print m $1 = std::map with 2 elements = {[1] = 2, [2] = 4}
如果它不能自动工作,您可以在GDB wiki的STL支持页面上看到第一个项目符号。
您也可以为自己的types编写Python漂亮的打印机,请参阅GDB手册中的漂亮打印 。
stl-views.gdb
曾经是最好的答案,但现在已经stl-views.gdb
了。
这还没有集成到主线GDB
,但是这里是你使用'archer-tromey-python' 分支得到的 :
(gdb) list 1 #include <map> 2 int main(){ 3 std::map<int,int> m; 4 m[1] = 2; 5 m[2] = 4; 6 return 0; 7 } (gdb) break 6 Breakpoint 1 at 0x8048274: file map.cc, line 6. (gdb) run Breakpoint 1, main () at map.cc:6 6 return 0; (gdb) print m $1 = std::map with 2 elements = { [1] = 2, [2] = 4 } (gdb) quit
总是有明显的:定义你自己的testing函数…从gdb调用它。 例如:
#define SHOW(X) cout << # X " = " << (X) << endl void testPrint( map<int,int> & m, int i ) { SHOW( m[i] ); SHOW( m.find(i)->first ); } int main() { std::map<int,int> m; m[1] = 2; m[2] = 4; return 0; // Line 15. }
和:
.... Breakpoint 1 at 0x400e08: file foo.C, line 15. (gdb) run Starting program: /tmp/z/qD Breakpoint 1, main () at qD.C:15 (gdb) call testPrint( m, 2) m[i] = 4 (*m.find(i)).first = 2 (gdb)
尝试解除引用STL容器:在此页面上: http : //www.yolinux.com/TUTORIALS/GDB-Commands.html
通过确保编译程序时编译器使用DWARF-2(或3或4)debugging信息,可以解决第二个问题( Cannot evaluate function -- may be inlined
)。 DWARF-2包含了内联信息,所以你应该能够使用你描述的方法来访问std::map
容器的元素。
要使用DWARF-2debugging信息进行编译,请将-gdwarf-2
标志添加到您的编译命令中。