2015-03-25 7 views
2

У меня есть следующий список указателей:Как распечатать содержимое списка указателей в gdb?

(вот простой пример, но на самом деле, мой список может быть componed сотнями записей)

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

Я успешно печатают содержание указателей, один за другим один, используя:

p *(const Point *) 0xae5c4e8 

Как распечатать содержимое предыдущего списка в одной команде?

+0

Каков тип данных самого списка? –

+0

Контейнер Roguewave –

ответ

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 

Вы можете обернуть это в новой команде GDB, написанный на Python, довольно легко.

Другой способ - использовать define, чтобы создать собственную команду с использованием командного языка gdb. Это немного уродливее и имеет некоторые (незначительные) ограничения по сравнению с подходом Python, но это все еще возможно.

Наконец, когда-то существовало расширение gdb под названием «дуэль», обеспечивающее эту функцию. К сожалению, он никогда не сливался.

1

Я не думаю, что есть простой способ показать все элементы списка сразу. Вы можете попробовать выполнить итерацию по статьям, используя:

В пакетном режиме. Проблема в том, что элементы списка не должны располагаться рядом друг с другом в памяти. Чтобы иметь лучший вариант предварительного просмотра при отладке, вы можете переключиться на std::vector.

Надеюсь, это поможет.

0

У меня есть следующий список указателей:

Вы, кажется, не имеют список, вы, кажется, есть массив. Давайте предположим, что это выглядит примерно так:

void *array[10] = {0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8}; 

Вы можете напечатать первые 4 разыменовываются элементы этого массива, как так:

(gdb) print ((Point**)array)[0]@4 
+0

1) Я думаю, что это должен быть массив print * * ((Point **)) [0] @ 4. 2) Arraylist - это массив и список. :) – dbrank0

Смежные вопросы