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

Joh*_*ter 204 c++ debugging gdb stl vector

我想检查std::vectorGDB中的内容,我该怎么做?让我们说这是std::vector<int>为了简单起见.

Joh*_*ter 252

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

print *(myVector._M_impl._M_start)@myVector.size()
Run Code Online (Sandbox Code Playgroud)

要仅打印前N个元素,请执行以下操作:

print *(myVector._M_impl._M_start)@N
Run Code Online (Sandbox Code Playgroud)

说明

这可能在很大程度上取决于您的编译器版本,但对于GCC 4.1.2,指向内部数组的指针是:

myVector._M_impl._M_start 
Run Code Online (Sandbox Code Playgroud)

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

print P@N
Run Code Online (Sandbox Code Playgroud)

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

p P@N
Run Code Online (Sandbox Code Playgroud)

  • 不为我工作。`无法计算函数——可能是内联的` (4认同)
  • 嘿嘿,这是我之前的错误,所以我今天早上只是查了一下,并将其作为备忘录添加到我自己(正如杰夫自己推荐的那样). (3认同)
  • 此外,如果您只想要一个特定的向量元素,myVector._M_impl._M_start + n(对于第n个元素) (3认同)
  • 要打印单个元素,例如第二个元素: print (myVector._M_impl._M_start)[2] (2认同)
  • 要在GDB 7.0+下为您的编译器找到特殊名称(_M_impl等),请使用print / r myVector。 (2认同)

小智 75

要查看vector std :: vector myVector内容,只需输入GDB:

(gdb) print myVector
Run Code Online (Sandbox Code Playgroud)

这将产生类似于的输出:

$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Run Code Online (Sandbox Code Playgroud)

要实现上述目标,你需要有gdb 7(我在gdb 7.01上测试过它)和一些python漂亮的打印机.这些安装过程在gdb wiki上有描述.

更重要的是,在上面安装之后,这适用于Eclipse C++调试器GUI(以及我认为使用GDB的任何其他IDE).

  • 只要矢量元素可以直接解释,这就可以正常工作.但是,如果向量包含指向感兴趣项目的指针,则无效. (14认同)

Nik*_*hil 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进行编译

  • 该链接是404. (6认同)

bad*_*eip 9

将以下内容放在〜/ .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
Run Code Online (Sandbox Code Playgroud)

重新启动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
Run Code Online (Sandbox Code Playgroud)

用法示例:

(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'}}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的代码!我猜有一个错字,“ print *($ arg0._M_impl._M_start + $ elem)@ 1”应该是“ print *($ arg0._M_impl._M_start + $ arg1)@ 1”吗?我使用以下修改:如果$ argc == 2,则定义print_vector,如果$ arg1&gt; = $ arg0.size()-1 printf“错误,%s.size()=%d,打印最后一个元素:\ n”,“ $ arg0“,$ arg0.size()-1结束打印*($ arg0._M_impl._M_start + $ arg1)@ 1 else print *($ arg0._M_impl._M_start)@ $ arg0.size()结束 (2认同)