LLDB не печатает содержимое std::вектор в коде, скомпилированном с помощью gcc/g

#gcc #gdb #clang #lldb

Вопрос:

Я пытаюсь использовать отладчик с VSCode на своем mac. По какой-то причине gdb не будет работать даже после подписания кода. Он завершается с ошибкой 134. Однако, похоже, он отлично работает в командной строке. VSCode будет отлично работать с компилятором lldb и clang и будет правильно отображать содержимое контейнеров STL.

Однако по какой-то причине мне нужно использовать компиляторы GCC. Как я уже говорил, GDB не работает с VSCode, поэтому я пытаюсь заставить LLDB работать. Однако LLDB неправильно отображает контейнеры stl. Когда я компилирую с флагом «-g», lldb вообще не отображает содержимое контейнеров stl должным образом. Он показывает необработанное содержимое контейнеров без какой-либо красивой печати. Когда я компилирую с флагом «-gdwarf-3» или «-gdwarf-4», он может правильно отображать строки. Но не содержимое векторов. Он просто говорит вектор с размером=0 и не обновляется, когда я вставляю элементы в вектор. Есть ли какой-либо способ/решение, чтобы заставить любой из отладчиков (lldb/gdb) правильно работать с довольно печатью для отладки файлов, скомпилированных с помощью компиляторов gcc.

Я пробовал версии gcc 11 и 9, а также версии gdb 8 и 10 без какого-либо успеха.

Ответ №1:

Как вы видели из необработанной печати, собственный макет вектора std::не очень полезен, и отладчику необходимо обработать данные, чтобы сделать их более удобными для пользователя. lldb использует «синтетических поставщиков дочерних услуг» для выполнения этой работы (подробнее о них здесь: https://lldb.llvm.org/use/variable.html#synthetic-children).

Поскольку внутренние детали реализаций GNU amp; clang STL, им нужны свои собственные отдельные синтетические дочерние поставщики.

lldb поставляется с довольно полным набором встроенных форматов данных для реализации clang STL. В нем также есть небольшой набор форматов gnu libstdc , в источниках здесь:

https://github.com/llvm/llvm-project/blob/main/lldb/examples/synthetic/gnu_libstdcpp.py

Они также поставляются с дистрибутивом LLDB (на macOS в LLDB.framework/Ресурсы/Python/lldb/форматеры/cpp) и должны быть зарегистрированы lldb. Там есть один для векторов std::. Форматеры назначаются путем сопоставления типов.

Вы можете определить, соответствует ли данная переменная синтетическому поставщику, выполнив:

 (lldb) type synthetic info myVec
synthetic applied to (std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >) myVec is:  libc   std::vector synthetic children
 

Это выходные данные для вектора libc std::. Вы должны увидеть нечто подобное для вектора GUN std::, который зарегистрирован с выражением, соответствующим типу:

 ^std::vector<. >(( )?amp;)?$:  Python class lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider
 

(это результат type synthetic list ). Первый элемент-это шаблон соответствия для данного типа. Вы могли бы проверить, каково фактическое имя класса std::vector, может быть, что-то меняет имя, так что мы больше не сопоставляем его?

Одно предостережение о type synthetic list списках форматирования типов строятся лениво, поэтому вам нужно попытаться напечатать что-то на C , прежде чем вы увидите полный список.