我想检查std::vector
GDB 中 a 的内容,我该怎么做?std::vector<int>
为了简单起见,假设它是一个。
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
要查看向量 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)。
将以下内容放入 ~/.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'}}
在调试时“观察”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 编译
聚会有点晚了,所以下次我做这个搜索时主要是提醒我!
我已经能够使用:
p/x *(&vec[2])@4
vec
从 .开始打印 4 个元素(作为十六进制)vec[2]
。