В большинстве случаев при отладке, если у меня есть вектор (в Xcode 9), мне показывают список индексов, представляющих значения в векторе.
В других случаях я получаю это бесполезное представление:
Я не могу понять, какие условия заставляют LLDB отображать векторы нежелательным образом.
Вопрос
Что вызывает нежелательное поведение? Можно ли это исправить, не переписывая код? Это ошибка в LLDB?
Вот краткий пример кода, который воспроизводит нежелательное поведение:
#include <iostream>
#include <vector>
std::vector<int> createVector()
{
std::vector<int> v = { 1, 2, 3 };
return v;
}
int main(int argc, const char * argv[])
{
const auto& v = createVector();
std::cout << v.front() << std::endl;
return 0;
}
Вот ссылка на проект Xcode:
http://s000.tinyupload.com/?file_id=21020556485232357417
Это известная ошибка в том, как сводка данных std :: vector & форматеры работают для справочных переменных. Обратите внимание, что в expr v
синтаксический анализатор выражений фактически рассматривает v как прямой вектор, а не ссылку на вектор … Вот почему эта печать работает.
Извините, я добавляю свой комментарий сюда в ответах, так как комментарии переполнения стека не поддерживают форматирование.
Это определенно проблема ЛЛДБ. Ваши фотографии не содержат полное описание:
v = (const std::__1::vector<int, std::__1::allocator<int> > &) size=1
size=1
это неверно.
Помимо команды print в консоли lldb печатает v
правильно:
(lldb) p v
(const std::__1::vector<int, std::__1::allocator<int> >) $1 = size=3 {
[0] = 1
[1] = 2
[2] = 3
}
Кажется, Xcode использует lldb frame var
Команда для отображения переменных. Это отображает точно такой же вывод, который отображается Xcode:
(lldb) frame variable -T
(int) argc = 1
(const char **) argv = 0x00007fff5fbff710
(const std::__1::vector<int, std::__1::allocator<int> > &) v = size=1: {
(std::__1::__vector_base<int, std::__1::allocator<int> >) std::__1::__vector_base<int, std::__1::allocator<int> > = {
(std::__1::__vector_base<int, std::__1::allocator<int> >::pointer) __begin_ = 0x000000010103fa40
(std::__1::__vector_base<int, std::__1::allocator<int> >::pointer) __end_ = 0x000000010103fa4c
(std::__1::__compressed_pair<int *, std::__1::allocator<int> >) __end_cap_ = {
(std::__1::__libcpp_compressed_pair_imp<int *, std::__1::allocator<int>, 2>) std::__1::__libcpp_compressed_pair_imp<int *, std::__1::allocator<int>, 2> = {
(int *) __first_ = 0x000000010103fa4c
}
}
}
}
Я думаю, что проблема заключается в том, что переменная v
изначально был создан и инициализирован в другом кадре стека, поэтому некоторая информация о векторе неизвестна в кадре нижнего стека, когда начальный вектор был передан в результате вызова функции.