如下图,当我们使用GDB调试core时,打印map时只能看到map结构的信息,而不能查看到map节点的值。
当然,从网上还是可以找到一些打印STL的解决方案,其中比较简单实用的一种方法是使用 gdb-stl-views
-
使用介绍:https://blog.csdn.net/xp178171640/article/details/123713783
-
官方地址:https://sourceware.org/gdb/wiki/STLSupport
使用 gdb-stl-views 打印的结果如下:
然而,虽然使用 gdb-stl-views 可以一定程度上面打印出来map的值,但是这种方法依然存在一些问题:
-
能打印的数值形式比较有限。例如上面的实例中map的key节点是包含指针的结构体,使用 gdb-stl-views 能打印出来结构体的内容,不能方便打印结构体指针的值;
-
使用 gdb-stl-views 只能遍历打印所有节点,不能按照树的左右节点打印值
-
gdb-stl-views 的打印效率很低(在本次示例中,因为core文件有70+G,平均1秒只能打印一个节点)
以查找目标key值= 0358822202 为例
-
先找到Map的根节点,并打印根节点的值,其中stock_account是map比较函数的key字段,比较函数为strcmp
-
因为 “0358822202” < “0607047xxxxxx”,所以第二次打印根节点的左节点
-
因为“014617xxxxxxxx”<“0358822202”,所以向右节点查找
-
以此类推,最终查找到目标节点,key=0358822202
新的方法参考自
gdb-stl-views
的实现
有的
gdb
版本不支持
打印
map
等stl,因此需要插件,在网上找到一个插件,进入
gdb
,source该文件即可。之后通过p
map
(pvector等)可以获取
打印
map
的提示,下面是工具代码,保存下,方便以后使用。
# ...
从这里下载一个
gdb
脚本:http://sourceware.org/
gdb
/wiki/STLSupport
启动
gdb
之后,用 source stl-views.
gdb
把这个脚本包含进来,
然后就可以用 p
map
命令
打印
map
的内容了。
在用
gdb调试
程序时,当程序运行到之前设置的断点时,很容易想到的操作就是查看当前变量的
值
,而
gdb
可以很轻易地满足的你的需求的~~
在
gdb
中
最常用的命令就是print(简写p),具体格式如下:
print
print/f f代表输出的格式
x 按十六进制格式显示变量
d 按十进制格式显示变量
u 按十六进制格式显示无符号整型
o 按八进制格式
使用
linux
的
GDB
打印
STL(vector,
map
,set…)
在
linux
用
gdb
或者c
gdb
计较不爽的地方是无法
打印
STL的东西,所有啊去网上找了找解决方案https://www.douban.com/note/182826844/?qq-pf-to=pcqq.c2c
来自链接:https://www.cnblogs.com/silentNight/p/5466418.html
使用
GDB
的"p variable-name"查看STL容器类,只会显示该容器的一些信息,并不能很友好的显示该容器的内容。使用stl-views.
gdb
这个脚本可以很好地解决这一问题。下载stl-veiws.
gdb
文件,将其放到~/目录下,直接将其改名为~/.
gdb
init,或者在你已有的.
gdb
init文件
中
用source
~/.stl-views.
gdb
命令将其包含。这样你就可以用下面的命