Подтвердить что ты не робот

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?

4b9b3361

Ответ 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)