LINUX.ORG.RU

GDB напечатать вектор обьектов (только некоторые поля)

 , ,


3

6

Допустим есть что-то такое в коде:

struct Foo {
   int a;
   std::string b;
};

std::vector<Foo*> foos;

Я хочу в gdb напечатать все обьекты из вектора, но только поле «b». Пытаюсь сделать через GDB Command:

(gdb) define pfoo
  set $v = $arg0
  set $i = 0
  while ($i < $v.size())
    print $v[$i]->b;  
  end
end

(gdb) pfoo foos 
Однако получаю ошибку:

Attempt to take address of value not located in memory.

Или еще проще:

(gdb) set $v = foos
# работает
(gdb) print $v
# не работает
(gdb) print $v.size()
Attempt to take address of value not located in memory.

Помогите пожалуйста сделать задуманное.

(gdb) print $v.size()

Так то точно делать нельзя, т.е. дёргать size() - не заработает на корке и с живым процессом из-за инлайна. Нужно вытаскивать begin и end вектора и в цикле итерировать указатель пока не вылезет за end. Аналогично и с v[j] - это означает взять в массиве из std::vector<Foo*> j-ый элемент, а не j-ый элемент вектора.

mashina ★★★★★ ()

info gdb говорит:

   You can save a value in a convenience variable with an assignment
expression, just as you would set a variable in your program.  For
example:

     set $foo = *object_ptr

would save in '$foo' the value contained in the object pointed to by
'object_ptr'.

А для вызова метода ему, видимо, нужно сделать this для объекта, который не является частью образа программы.

# по значению
(gdb) set $v = args
(gdb) p $v
$2 = std::vector of length 0, capacity 0
(gdb) p $v.size()
Attempt to take address of value not located in memory.

# по адресу
(gdb) set $v = &args
(gdb) p *$v
$3 = std::vector of length 0, capacity 0
(gdb) p $v->size()
$4 = 0

Команда может выглядеть как-то так:

define pfoo
    set $v = &$arg0
    set $i = 0
    while ($i < $v->size())
        print (*$v)[$i++]->b
    end
end

xaizek ★★★★★ ()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek

О, спасибо. Я думал, что conventional variables — просто строки для eval.

KennyMinigun ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.