如何在GDB中打印C ++向量的元素?

我想在GDB中检查一个std::vector的内容,我该怎么做呢? 为了简单起见,我们假设它是一个std::vector<int>

要查看向量std :: vector myVector的内容,只需inputGDB:

 (gdb) print myVector 

这将产生类似于以下的输出:

 $1 = std::vector of length 3, capacity 4 = {10, 20, 30} 

为了达到上述目的,你需要有gdb 7(我在gdb 7.01上testing过)和一些python漂亮的打印机。 这些的安装过程在gdb wiki上描述。

更重要的是,在上面的安装之后,这与Eclipse C ++debugging器GUI(以及使用GDB的任何其他IDE,我认为)都能很好地协作。

使用GCC 4.1.2,打印一个名为myVector的std :: vector <int>,执行以下操作:

 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 

而GDB命令打印从指针P开始的数组的N个元素是:

 print P@N 

或者,以简写forms(对于标准.gdbinit):

 p P@N 

在debugging时观看STL容器是一个问题。 以下是我过去使用的三种不同的解决scheme,没有一个是完美的。

1)使用http://clith.com/gdb_stl_utils/中的; GDB脚本这些脚本允许您打印几乎所有STL容器的内容。 问题是,这不适用于嵌套容器,如堆栈。

2)Visual Studio 2005支持观看STL容器。 这适用于嵌套的容器,但这仅适用于STL的实现,如果将STL容器放在Boost容器中,则不起作用。

3)在debugging过程中为您要打印的特定项目编写自己的“打印”function(或方法),并在GDB中使用“呼叫”打印项目。 请注意,如果你的打印函数没有在代码中的任何地方被调用,g ++将执行死代码消除,并且GDB将找不到“打印”函数(你会得到一个消息,说函数是内联的)。 所以用-fkeep-inline-functions编译

把下面的内容放在〜/ .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(或sourcing〜/ .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'}}