我想检查GDB中std::vector
的内容,我该怎么做?为简单起见,我们假设它是std::vector<int>
。
答案 0 :(得分:248)
使用GCC 4.1.2,打印整个std :: vector&lt; int&gt;名为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
答案 1 :(得分:72)
要查看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)。
答案 2 :(得分:14)
在调试时“观察”STL容器有点问题。以下是我过去使用的3种不同解决方案,其中没有一种是完美的。
1)使用http://clith.com/gdb_stl_utils/中的GDB脚本这些脚本允许您打印几乎所有STL容器的内容。问题是这不适用于嵌套容器,如堆栈。
2)Visual Studio 2005对观看STL容器提供了极好的支持。这适用于嵌套容器,但这仅适用于STL的实现,如果您将STL容器放在Boost容器中,则不起作用。
3)在调试时为您要打印的特定项目编写自己的“打印”功能(或方法),并在GDB中使用“调用”打印项目。请注意,如果您的打印功能未在代码中的任何位置被调用,则g ++将执行死代码消除,并且GDB将找不到“打印”功能(您将收到一条消息,指出该功能已内联)。所以使用-fkeep-inline-functions
进行编译答案 3 :(得分:8)
将以下内容放在〜/ .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'}}
答案 4 :(得分:0)
聚会晚了一点,所以下次我进行搜索时主要是在提醒我!
我已经可以使用:
p/x *(&vec[2])@4
从vec
开始从vec[2]
打印4个元素(十六进制)。