LLDB иногда отображает векторные данные, а иногда нет

В большинстве случаев при отладке, если у меня есть вектор (в 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

5

Решение

Это известная ошибка в том, как сводка данных std :: vector & форматеры работают для справочных переменных. Обратите внимание, что в expr v синтаксический анализатор выражений фактически рассматривает v как прямой вектор, а не ссылку на вектор … Вот почему эта печать работает.

3

Другие решения

Извините, я добавляю свой комментарий сюда в ответах, так как комментарии переполнения стека не поддерживают форматирование.

Это определенно проблема ЛЛДБ. Ваши фотографии не содержат полное описание:

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 изначально был создан и инициализирован в другом кадре стека, поэтому некоторая информация о векторе неизвестна в кадре нижнего стека, когда начальный вектор был передан в результате вызова функции.

3

По вопросам рекламы [email protected]