我想检查一个std::矢量在GDB的内容,我怎么做?为了简单起见,我们设它为std::vector<int>。
当前回答
要查看vector std::vector myVector内容,只需输入GDB:
(gdb) print myVector
这将产生类似于:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
要实现上述目标,您需要有gdb 7(我在gdb 7.01上测试了它)和一些python漂亮打印机。这些工具的安装过程在gdb wiki上有描述。
更重要的是,在上面安装之后,它可以很好地与Eclipse c++调试器GUI(以及我认为使用GDB的任何其他IDE)一起工作。
其他回答
将以下内容放到~/.gdbinit中
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
重新启动gdb(或源~/.gdbinit)后,像这样显示相关的帮助
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
使用示例:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}
在调试时“监视”STL容器有点问题。以下是我过去用过的3种不同的解决方案,没有一个是完美的。
1)使用来自http://clith.com/gdb_stl_utils/的GDB脚本,这些脚本允许您打印几乎所有STL容器的内容。问题是,这对嵌套容器(如集合的堆栈)不起作用。
2) Visual Studio 2005对监视STL容器提供了出色的支持。这适用于嵌套容器,但这只适用于它们对STL的实现,如果您将STL容器放入Boost容器中,则不适用。
3)为调试时想要打印的特定项编写自己的'print'函数(或方法),并在GDB中使用'call'来打印该项。注意,如果你的print函数在代码中任何地方都没有被调用,g++将执行死代码消除,并且'print'函数将不会被GDB找到(你将得到一条消息,说函数是内联的)。所以使用-fkeep-inline-functions进行编译
在GCC 4.1.2中,要打印std::vector<int>的整个myVector,执行以下操作:
print *(myVector._M_impl._M_start)@myVector.size()
要只打印前N个元素,请执行以下操作:
print *(myVector._M_impl._M_start)@N
解释
这可能严重依赖于你的编译器版本,但对于GCC 4.1.2,指向内部数组的指针是:
myVector._M_impl._M_start
打印数组中从指针P开始的N个元素的GDB命令是:
print P@N
或者,在一个简短的形式(对于标准的.gdbinit):
p P@N
有点晚了,所以主要是提醒我下次我做这个搜索!
我已经能够使用:
p/x *(&vec[2])@4
从vec从vec[2]开始打印4个元素(作为十六进制)。
要查看vector std::vector myVector内容,只需输入GDB:
(gdb) print myVector
这将产生类似于:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
要实现上述目标,您需要有gdb 7(我在gdb 7.01上测试了它)和一些python漂亮打印机。这些工具的安装过程在gdb wiki上有描述。
更重要的是,在上面安装之后,它可以很好地与Eclipse c++调试器GUI(以及我认为使用GDB的任何其他IDE)一起工作。
推荐文章
- 确保您的项目构建设置正在生成一个dSYM文件。对于所有配置,DEBUG_INFORMATION_FORMAT都应该设置为dwarf-with-dsym
- 如何获得GDB中所有线程的回溯?
- 为什么标准迭代器范围是[begin, end]而不是[begin, end]?
- c++双地址操作符?(& &)
- 函数标题中的箭头操作符(->)
- 如何在c++中初始化一个向量
- 返回类型为'?:'(三元条件运算符)
- 当分配vector时,它们使用的是堆上的内存还是堆栈上的内存?
- 互斥实例/教程?
- 如何添加一个'或'条件在#ifdef
- 纯虚函数的实现
- 为什么在c++中声明enum时使用typedef ?
- 对静态类成员的未定义引用
- c++中“using”关键字背后的逻辑是什么?
- 什么时候我应该在Scala中选择向量?