Intereting Posts
Отправлять данные в отдельных сегментах TCP без объединения в стек TCP Файловая система C ++ 11 (VS2012) текстовый объект с динамическим размером с конструктором копирования, тривиальный оператор присваивания и тривиальный деструктор декодирование speex происходит неправильно Должен ли ссылочный тип инициализироваться в списке инициализации конструктора? Для вектора точек (возможно, не по порядку) найдите многоугольник (не выпуклый корпус) Входная проверка, чтобы убедиться, что только число c ++ Использование функции haskell из C ++: неопределенная опорная ошибка Что происходит с близостью streamа объекта QObject, созданного в рабочем streamе, который затем завершается? Связь между auto и decltype Являются ли функции-указатели функций объектами в C ++? функция времени компиляции для проверки равенства типов специализировать конструктор classа шаблона Массив строк с malloc на C ++ Класс, унаследованный от classа без конструктора по умолчанию

Печать / отладка libc ++ STL с XCode / LLDB

Я пытаюсь использовать LLDB в Xcode 8 для отладки очень простой STL. Раньше я мог печатать такой вектор:

p myvector[0] 

чтобы увидеть, что было в первом векторном индексе. Теперь, когда я это сделаю, я получаю эту ошибку:

 error: Couldn't lookup symbols: __ZNSt3__16vectorI9my_classNS_9allocatorIS1_EEEixEm 

Вместо этого мне нужно набрать это:

 p myvector.__begin_[0] 

чтобы получить какой-либо результат.

Я попытался импортировать скрипты libcxx.py и unordered_multi.py из репозитория svn LLDB, но это ничего не меняет.

Кто-нибудь мог получить полезный вывод из LLDB с помощью libc ++?

[] – это операторный метод на std::vector , поэтому для распечатки требуемого выражения lldb должен будет иметь возможность вызвать метод [] . Проблема здесь в том, что STL на OS X агрессивно относится к вложению всего, что может, и не тратить впустую пространство, производящее из линейных копий одни и те же функции. Это отлично подходит для оптимизированного кода, но не так хорошо подходит для отладки, потому что он оставляет отладчик без оператора [] для вызова. Это сообщение об ошибке, которое вы видите.

Если вы просто хотите увидеть элементы в этом векторе, вы можете использовать lldb « Форматы данных STL» для выполнения этой работы для вас. Они знают, как выкладываются большинство типов STL, и могут печатать элементы большинства типов контейнеров. Например:

 (lldb) expr my_vec[0] error: Couldn't lookup symbols: __ZNSt3__16vectorI3FooNS_9allocatorIS1_EEEixEm 

но:

 (lldb) expr my_vec (std::__1::vector >) $0 = size=2 { [0] = (var1 = 10, var2 = 20) [1] = (var1 = 10, var2 = 20) } 

Существует также другая команда «frame variable», которая может проверять статические объекты и перехватывает данные. Он не может вызывать функции и выполнять другие более сложные задачи парсера выражения, но он знает, как использовать формирователи данных STL для извлечения отдельных элементов:

 (lldb) frame var my_vec[1] (Foo) my_vec[1] = (var1 = 10, var2 = 20) 

Вы даже можете использовать опцию -L frameworks var для поиска элементов вектора, а затем вы можете передать адрес, чтобы передать его другим функциям:

 (lldb) frame var -L my_vec[1] 0x0000000100100348: (Foo) my_vec[1] = { 0x0000000100100348: var1 = 10 0x000000010010034c: var2 = 20 } (lldb) expr printf("%d\n", ((class Foo *) 0x0000000100100348)->var1) 10 (int) $3 = 3 

Другой способ обойти это для отладки – если вы используете C ++ 11 – это:

 template class std::vector 

в вашем коде где-нибудь. Это даст указание компилятору испустить вне очереди копии всех функций шаблона для этой специализации. Это не большое общее решение, и вы хотите сделать это только для отладочных compilationов, но это позволяет вам вызывать эти функции и использовать их в сложных выражениях.

Аналогичная проблема также возникает со мной: error: Couldn't lookup symbols:

Мое решение состоит в том, чтобы явно использовать запрошенную функцию где-то в исходном коде.

 #include  template struct Vector : std::vector { Vector(size_t n) : std::vector{n} {} T& operator[](size_t n) { return std::vector::operator[](n); } }; struct XXX { int x; }; void func() { std::vector a{10}; Vector b{10}; auto x = b[0]; // gcc will produce an assembler code of operator[] for debug purpose 1; // as a break point } 

Установите точку останова в строке 1; и запустите его.

 (lldb) pa[0] error: Couldn't lookup symbols: __ZNSt3__16vectorI3XXXNS_9allocatorIS1_EEEixEm (lldb) pb[0] (XXX) $0 = (x = 0) 

Бинго!! Существует ли функция в блоке TEXT?

 (lldb) image lookup -r -n 'XXX.*operator' 1 match found in /Users/xxx/Library/Developer/Xcode/DerivedData/xxx: Address: sandbox[0x00000001000011f0] (sandbox.__TEXT.__text + 256) Summary: sandbox`Vector::operator[](unsigned long) at main.cpp:19 

Я не уверен, но я узнал об этом раньше. На этапе отладки вместо стадии производства. Если мы установим точку останова в строке в функции шаблона, что бы сделал отладчик? Установка контрольных точек, фактически заменяя какой-то существующий код ассемблера ловушкой или прыжком, здесь и там везде применяется шаблон? Или просто установить одну точку останова в функции? Он написан как шаблон. Поэтому он должен быть встроен на стадии производства. Однако на этапе отладки функция не встроена и не записана как нормальная функция. Пожалуйста, не просто верите, что я говорю здесь. Пожалуйста, подтвердите сами. Проконсультируйтесь с документацией gcc, clang, и lldb.

#include для MacOS 10.13.6, версия Xcode 9.4.1 имеет макрос _LIBCPP_INLINE_VISIBILITY :

 template  inline _LIBCPP_INLINE_VISIBILITY typename vector<_Tp, _Allocator>::reference vector<_Tp, _Allocator>::operator[](size_type __n) { _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); return this->__begin_[__n]; } 

_LIBCPP_INLINE_VISIBILITY определяется в #include <__config> как:

 #define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__)) 

Такие ключевые слова hidden и __always_inline__ похоже, контролируют поведение.

Когда я добавил inline _LIBCPP_INLINE_VISIBILITY в примерный код решения выше:

  inline _LIBCPP_INLINE_VISIBILITY T& operator[](size_t n) { return std::vector::operator[](n); } 

привели к:

 (lldb) pb[0] error: Couldn't lookup symbols: __ZN6VectorI3XXXEixEm 

Надеюсь, что помощь и кто-то заглянет глубже.