2013-08-12 3 views
2

я пытаюсь напечатать содержимое массива, как это, и это успешно:GDB не может распечатать содержимое массива

p/x t->arr 
$1 = {0x63, 0x61, 0x74, 0x31, 0x2e, 0x6a, 0x70, 0x67, 0x0 <repeats 248 times>} 

Однако, когда я пытаюсь по-другому, как это:

(gdb) p &t->arr 
$2 = (char (*)[256]) 0x60c4d0 
p/100x *0x60c4d0 
Item count other than 1 is meaningless in "print" command. 

t-> arr определяется как arr [256] в структуре. Я что-то делаю неправильно?

+0

Я не уверен, что понимаю, в чем ваша цель? Или, что вы надеетесь, 'p/100x' будет делать? – Macattack

+0

@macattack Я пытаюсь создать тот же результат, что и p/x t-> arr. Однако в последнем случае я пытаюсь напечатать адрес массива вместо использования «t-> arr» –

+0

Возможно, если вы сделали 'p/100x (char *) * 0x60c4d0'? Так что gdb знает, что это s 'char *' по адресу. Я никогда не использовал синтаксис 'p/# x'. – Macattack

ответ

3

В gdb вы можете присвоить буквальное значение указателя любому типу, который, по вашему мнению, подходит. Итак, если вы хотите рассматривать адрес как указатель на массив, вы можете просто его перевести как таковой и распечатать.

(gdb) p argv 
$1 = (char **) 0x7fffffffe898 
(gdb) p *(char *(*)[2])0x7fffffffe898 
$2 = {0x7fffffffeae1 "/tmp/a.out", 0x0} 
+0

ах, я вижу. Спасибо –

+0

@eldwinh: Добро пожаловать. – jxh

2
p/100x *0x60c4d0 

Здесь вы просите GDB напечатать 100 элементов в ячейке памяти 0x60c4d0, который означает меньше, потому что ячейка памяти 0x60c4d0 может содержать только один элемент. Следовательно, ошибка гласит, что ничего, кроме 1, не имеет смысла.

p/256x 0x60c4d0 

Это дает 256 адресов, начиная с 0x60c4d0, которые будут адреса каждого из 256 символьных элементов в массиве.

+0

поскольку «p & t-> arr» print (char (*) [256]) 0x60c4d0, я думаю, массив находится в этом адресе правильно? таким образом, я должен иметь возможность распечатать 100 элементов этого массива. –

+0

массив не расположен «в» этом адресе, но он начинается с этого адреса. – Sarat

0

Есть два аспекта, которые необходимо учитывать:

  1. Учитывая указатель GDB печатает адрес, а не то, что он указывает. Итак, если у вас переменная pc типа char *, p будет печатать только адрес.

  2. Выполнение разыменования переменной указателя получает значение, которое оно указывает, поскольку GDB может определить его тип. Итак, если вы напечатаете * pc, вы получите значение, так как тип известен. С другой стороны, если у вас есть pa типа char [25], p будет знать тип и рассматривать его как массив и печатать его элементы.

Однако, если вы хотите, чтобы GDB обрабатывал адрес в виде массива, вам придется его обучать. Поэтому, когда вы используете начальный массив как адрес, GDB теперь должен знать тип: - Если вы говорите, что это символ *, GDB напечатает адрес. - Если вы говорите, что это символ * и разыгрывает его, GDB будет печатать значение char по этому адресу. - если вы говорите, что это символ (*) [25], GDB напечатает эти элементы.

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