Gdb Не удалось найти оператор []
double var1, var2;
std::vector<double *> x;
var1 = 1;
var2 = 2;
x.push_back(&var1);
x.push_back(&var2);
Когда я отлаживаю этот код в gdb и пытаюсь print x[0]
или *x[0]
я получаю:
Не удалось найти оператор [].
Теперь, если я включу эту строку после push_back
:
x[0] = &var1;
Я могу получить доступ к любым конкретным элементам в GDB. То же самое происходит с другими членами, такими как front()
, at()
и т.д. Насколько я понимаю, компилятор/компоновщик включает только функции-члены, присутствующие в исходном коде, и те, которые я могу использовать в gdb. Есть ли способ включить каждую функцию-член std::vector
чтобы я мог получить к ним доступ в GDB?
Ответы
Ответ 1
Я понимаю, что компилятор/компоновщик включает только функции-члены, присутствующие в исходном коде, и те, которые я могу использовать в gdb.
Ваше понимание неверно/неполно.
std::vector
- это шаблонный класс. Без явного инстанцирования компилятор должен создавать экземпляры только тех методов (обычно это подмножество методов, присутствующих в источнике).
Есть ли способ включить каждую функцию-член из std::vector, чтобы я мог получить к ним доступ в gdb?
Для данного типа T
вы должны иметь возможность явно инстанцировать весь вектор для этого T
, запросив его, например:
template class std::vector<double>;
Ответ 2
Попробуйте выполнить печать по внутреннему элементу вектора.
print *(x._M_impl._M_start+0)
Здесь 0
- индекс данных, которые вы хотите проверить.
Вдохновленный этот ответ.
Ответ 3
В качестве альтернативы вы можете использовать расширение GDB ниже, которое будет ткнуть в поля std::vector
GNU libstdС++ и, таким образом, работает независимо от того, создается ли operator[]
.
Загрузите с помощью:
(gdb) guile (load "the-file.scm")
Это создает новую команду vref
:
(gdb) vref my_vector 0
Код (требуется GDB, построенный с Guile поддержка):
(use-modules (gdb)
(ice-9 match))
(define (std::vector-ref vector index)
(let* ((impl (value-field vector "_M_impl"))
(start (value-field impl "_M_start")))
(value-subscript start index)))
(define %vector-ref-command
(make-command "vref"
#:command-class COMMAND_OBSCURE
#:doc "Access an element of an std::vector."
#:invoke
(lambda (self args tty?)
(match (string-tokenize args)
((variable index)
(let* ((value (std::vector-ref (parse-and-eval variable)
(string->number index)))
(index (history-append! value)))
(format #t "$~a = ~a~%"
index (value-print value)))))
#t)))
(register-command! %vector-ref-command)