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

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


要查看向量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,我认为)可以很好地协作。


使用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

或者,以简短形式(对于标准.gdbinit):

p P@N

在调试时观看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编译

链接地址: http://www.djcxy.com/p/86023.html

上一篇: How do I print the elements of a C++ vector in GDB?

下一篇: How do I print the full value of a long string in gdb?