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

问题描述 投票:209回答:5

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

c++ debugging stl vector gdb
5个回答
79
投票

要查看矢量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)一起很好地工作。


256
投票

使用GCC 4.1.2,要打印名为myVector的整个std :: vector ,请执行以下操作:

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

14
投票

“在调试时监视” STL容器有点问题。这是我过去使用过的3种不同的解决方案,没有一个是完美的。

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

2)Visual Studio 2005对观看STL容器提供了出色的支持。这适用于嵌套容器,但这仅适用于STL的实现,如果将STL容器放入Boost容器,则无效。

3)在调试时为要打印的特定项目编写自己的“打印”功能(或方法),并在GDB中使用“调用”来打印该项目。请注意,如果未在代码中的任何地方调用您的print函数,则g ++会消除无效代码,并且GDB不会找到'print'函数(您会收到一条消息,指出该函数是内联的)。因此,请使用-fkeep-inline-functions进行编译


11
投票

将以下内容放入〜/ .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'}}

0
投票

聚会晚了一点,所以下次我进行搜索时主要是在提醒我!

© www.soinside.com 2019 - 2024. All rights reserved.