我想检查std::vector
GDB 中a的内容,我该怎么做?假设是std::vector<int>
为了简单起见。
我想检查std::vector
GDB 中a的内容,我该怎么做?假设是std::vector<int>
为了简单起见。
Answers:
要查看vector std :: vector myVector内容,只需输入GDB:
(gdb) print myVector
这将产生类似于以下内容的输出:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
要实现以上目标,您需要安装gdb 7(我在gdb 7.01上对其进行了测试)和一些python pretty-printer。这些的安装过程在gdb wiki上进行了描述。
而且,在完成上述安装之后,它可以与Eclipse C ++调试器GUI(以及我认为使用GDB的任何其他IDE)配合使用。
$HOME/.gdbinit
是必要的。目前,我根本没有这样的文件,并gdb
正确显示的内容std::vector
。但是,由于在尝试“漫游”时,我只是安装了一个版本,然后才进行安装cgdb
,因此我已经libstdc++5
安装了,所以我不知道为什么漂亮的打印现在无法正常工作。
使用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
Cannot evaluate function -- may be inlined
_M_impl
在GDB 7.0+下为您的编译器找到特殊名称(等),请使用print /r myVector
在调试时“监视” 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编译
将以下内容放入〜/ .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'}}