用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标志添加到您的编译命令中。