假设有这样的事情:
#include
我希望能够从gdb检查运行该程序的地图的内容.
如果我尝试使用下标运算符,我得到:
(gdb) p m[1] Attempt to take address of value not located in memory.
使用find方法不会产生更好的结果:
(gdb) p m.find(1) Cannot evaluate function -- may be inlined
有没有办法实现这个目标?
现有的这个问题的答案是非常不合时宜的.由于GDB 7.x中内置的Python支持以及GCC附带的libstdc ++漂亮打印机,最近的GCC和GDB it Just Works TM.
对于OP的例子,我得到:
(gdb) print m $1 = std::map with 2 elements = {[1] = 2, [2] = 4}
如果它不能自动运行,请在GDB wiki 的STL支持页面上看到第一个项目符号点.
您也可以为自己的类型编写Python漂亮的打印机,请参阅GDB手册中的Pretty Printing.
我认为没有,至少没有,如果您的源是优化等.但是,有一些gdb的宏可以为您检查STL容器:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
但是,我不使用这个,所以YMMV
总是显而易见的:定义自己的测试函数...从gdb调用它.例如:
#define SHOW(X) cout << # X " = " << (X) << endl void testPrint( map& m, int i ) { SHOW( m[i] ); SHOW( m.find(i)->first ); } int main() { std::map 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-views.gdb
曾经是最好的答案出现了,但现在不是了.
这还没有集成到主线中GDB
,但是你可以使用'archer-tromey-python' 分支:
(gdb) list 1 #include
尝试取消引用STL容器:在此页面上:http://www.yolinux.com/TUTORIALS/GDB-Commands.html