如何在gdb中打印指针列表的内容?

时间:2015-03-25 10:52:47

标签: c++ c++11 gdb

我有以下指针列表:

(这是一个简单的例子,但实际上,我的列表可以通过数百个条目进行编译)

{0xae5c4e8, 0xa09d4e8, 0xa753458,  0xae554e8}

我通过使用:

逐个成功地打印指针内容
p *(const Point *) 0xae5c4e8

如何在一个命令中打印前面列表的内容?

3 个答案:

答案 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