关于 GDB 查看 STL 元素值

2020-09-30 09:42:50 +08:00
 yanyanlongxia

我想知道如何用 GDB 查看 C++ STL 容器(如 map 、priority _ queue)中的每个元素的值。

网上也有一个方法,就是下载一个脚本,替换配置,我在本机也是这么设置的。

可是,我们马上就要考试了,我亲测考场电脑里没有那个脚本(考试也不可能开网),我想知道考试时如何使用 GDB 查看 STL 元素的值(当然可以直接写函数输出,但是总觉得这样太烦了)

考试环境: 系统:Ubuntu 14.04 LTS 。 内置软件(都是纯净的):vim 、 gedit 、g++/gcc&gdb 、guide 、python3 ……(反正其他的就是 Ubuntu 自带了)

2624 次点击
所在节点    C++
14 条回复
ruanimal
2020-09-30 10:06:22 +08:00
不懂,C++就是麻烦
InkStone
2020-09-30 10:17:52 +08:00
你可以试一下,stl 的内部结构也没复杂到看不到每个元素值的地步……我记得早期一些 IDE 没有对 STL 的支持,也都是手动展开来看的。

不过你们这考试也太折腾人了吧,连 IDE 都不给一个。
zvl0reqglvd
2020-09-30 10:18:52 +08:00
print 数组首地址 @查看长度
yanyanlongxia
2020-09-30 15:53:59 +08:00
@zvl0reqglvd 请问能举个例子吗?谢谢了(主要是没太看懂)
yanyanlongxia
2020-09-30 15:55:11 +08:00
@InkStone 其实我平时用的 CLion 就自带完美支持查看 STL,只是考试没有……
yanyanlongxia
2020-09-30 16:50:43 +08:00
突然发现在程序里写一个 print 函数,在 gdb 里面需要时调用 call print()就很简单……
disk
2020-09-30 17:20:45 +08:00
14.04 有点老了,不知道 gdb 版本是多少,7.0 后才支持 python 拓展,系统自带的直接 p STL 变量就完事了。不然就先 p vec 看下结构,然后按照输出的结构 p *(vec._M_impl._M_start)@vec.size(),不知道行不行。
yanyanlongxia
2020-10-01 11:43:01 +08:00
@disk GDB 版本是 7.7.1 的,请问能细说一下怎么用吗?谢谢
disk
2020-10-03 20:39:46 +08:00
@yanyanlongxia 你需要去看下 GDB 的使用教程。要查看一个变量,你至少需要它的首地址,如果是顺序存储要看长度,如果是复杂的结构要考虑指出类型。像 map 这种红黑树实现不靠脚本看起来是很麻烦的,你可以写一个 print 函数把容器的元素遍历打印出来,然后在调试中随时 call 这个函数来查看。
yanyanlongxia
2020-10-06 00:41:08 +08:00
@disk emmm……我好像就是这么做的。(手写 print 函数应对一切数据结构)
nightwitch
2020-10-08 21:06:35 +08:00
你们考场不给提供 IDE ? 不可能吧 国内的计算机教学水准已经提高到人均都能 gdb debug 的程度了?
yanyanlongxia
2020-10-10 15:31:54 +08:00
@nightwitch (其实是竞赛
yanyanlongxia
2020-10-10 15:32:37 +08:00
就是全国信息学奥林匹克联赛
yanyanlongxia
2020-10-10 15:57:10 +08:00
(其实我觉得 gdb 调试的扩展性比 IDE 要强很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711766

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX