#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 , прежде чем вы увидите полный список.