我有以下指针列表:
(这是一个简单的例子,但实际上,我的列表可以通过数百个条目进行编译)
{0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8}
我通过使用:
逐个成功地打印指针内容p *(const Point *) 0xae5c4e8
如何在一个命令中打印前面列表的内容?
答案 0 :(得分:4)
没有固定的方法可以做到这一点。如果你可以输入print *(*p @ 23)
- 在另一个表达式中使用@
扩展名,导致隐式循环,那就太酷了 - 但你不能。
然而,有两种不错的方法可以做到这一点。
一种方法是使用Python。类似的东西:
(gdb) python x = gdb.parse_and_eval('my_array')
(gdb) python
> for i in range(nnn):
> print x[i].dereference()
> end
你可以很容易地将它包装在一个用Python编写的新gdb命令中。
另一种方法是使用define
使用gdb命令语言创建自己的命令。这有点丑陋,与Python方法相比有一些(次要)限制,但它仍然可行。
最后,曾经有一个名为" duel"的gdb扩展名。提供此功能。不幸的是,它从未被合并过。
答案 1 :(得分:1)
我认为没有一种简单的方法可以同时显示所有列表元素。您可以尝试使用以下方法遍历项目:
set $it=mylist.begin()._M_node
print *(*(std::_List_node<const Point *>*)$it)._M_data
set $it=(*$it)._M_next
...
批处理方式。问题是列表项不需要在存储器中彼此靠近。要在调试中获得更好的预览选项,您可以切换到std::vector
。
希望这会有所帮助。
答案 2 :(得分:0)
我有以下指针列表:
您似乎没有列表,您似乎有一个数组。我们假设它看起来像:
void *array[10] = {0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8};
您可以像这样打印该数组的前4个解除引用元素:
(gdb) print ((Point**)array)[0]@4