226

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

4

5 回答 5

279

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

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

print P@N

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

p P@N
于 2008-10-31T10:33:23.477 回答
82

要查看向量 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)。

于 2010-01-23T13:23:51.787 回答
14

将以下内容放入 ~/.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'}}
于 2014-08-26T06:57:03.180 回答
13

在调试时“观察”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 编译

于 2009-03-01T14:53:31.020 回答
0

聚会有点晚了,所以下次我做这个搜索时主要是提醒我!

我已经能够使用:

p/x *(&vec[2])@4

vec从 .开始打印 4 个元素(作为十六进制)vec[2]

于 2020-05-15T16:04:59.850 回答