代码之家  ›  专栏  ›  技术社区  ›  John Carter

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

  •  197
  • John Carter  · 技术社区  · 16 年前

    std::vector 在GDB中,我该如何做?假设这是一个 std::vector<int> 为了简单起见。

    4 回复  |  直到 13 年前
        1
  •  274
  •   gagallo7    13 年前

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

    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 
    

    print P@N
    

    或者,简而言之(对于标准的.gdbinit):

    p P@N
    
        2
  •  82
  •   Michał Oniszczuk    15 年前

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

    (gdb) print myVector
    

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

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

    要实现上述目标,您需要有GDB7(我在GDB7.01上测试了它)和一些python漂亮的打印机。有关这些的安装过程,请参见 gdb wiki .

    日食

        3
  •  14
  •   badeip    10 年前

    将以下内容放入~/.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'}}
    
        4
  •  13
  •   Gustavo Maciel Pepe    10 年前

    调试时“监视”STL容器有些问题。下面是我过去使用过的3种不同的解决方案,它们都不是完美的。

    http://clith.com/gdb_stl_utils/ 这些脚本允许您打印几乎所有STL容器的内容。问题是,这不适用于像集合堆栈这样的嵌套容器。

    3) 为调试时要打印的特定项编写自己的“打印”函数(或方法),并在GDB中使用“调用”打印该项。请注意,如果您的print函数没有在代码中的任何地方被调用,g++将执行死代码消除,并且GDB将找不到“print”函数(您将收到一条消息,说明该函数是内联的)。因此,使用-fkeep内联函数进行编译

        5
  •  0
  •   Mike P    4 年前

    派对有点晚了,所以下次我做这个搜索的时候给我一个提醒!

    我已经能够使用:

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

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