假设有这样的东西:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
我希望能够从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
有没有办法实现这个目标?
答案 0 :(得分:81)
此问题的现有答案非常已过时。得益于GDB 7.x中内置的Python支持以及GCC附带的libstdc ++漂亮打印机,最近的GCC和GDB它只是工作 TM 。
对于OP的例子,我得到:
(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}
如果它不能自动运行,请在GDB wiki的STL Support页面上看到第一个项目符号点。
您也可以为自己的类型编写Python漂亮的打印机,请参阅GDB手册中的Pretty Printing。
答案 1 :(得分:32)
我认为没有,至少没有,如果你的源是优化的等等。但是,有一些gdb的宏可以为你检查STL容器:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
但是,我不使用这个,所以YMMV
答案 2 :(得分:20)
总是显而易见的:定义自己的测试函数...从gdb调用它。 E.g:
#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)
答案 3 :(得分:20)
stl-views.gdb
曾经是最好的答案,但不再是。
这还没有整合到主线GDB
中,但是这里使用的是'archer-tromey-python'branch:
(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
答案 4 :(得分:12)
尝试取消引用STL容器:在此页面上:http://www.yolinux.com/TUTORIALS/GDB-Commands.html
答案 5 :(得分:0)
通过确保编译器在编译程序时使用DWARF-2(或3或4)调试信息,可以解决第二个问题(Cannot evaluate function -- may be inlined
)。 DWARF-2包含内联信息,因此您应该能够使用您描述的任何一种方法来访问std::map
容器的元素。
要使用DWARF-2调试信息进行编译,请将-gdwarf-2
标志添加到编译命令中。
答案 6 :(得分:0)
上面的答案行之有效。如果您使用的是stl-views.gdb,这是查看其中的地图和元素的正确方法。
让您的地图如下:
std::map<char, int> myMap;
(gdb) pmap myMap char int
即pmap <variable_name> <left_element_type> <right_element_type>
以查看地图中的元素。
希望有帮助。