LLDB (отладчик) - LLDB (debugger)

LLDB
Разработчики)Группа разработчиков LLVM
Репозиторий Отредактируйте это в Викиданных
Написано вC ++
Операционная системаmacOS i386 и x86-64, Linux, FreeBSD, NetBSD, Windows
ТипОтладчик
ЛицензияUIUC (BSD-стиль )
Лицензия Apache 2.0 с исключениями LLVM (v9.0.0 или новее)[1]
Интернет сайтlldb.llvm.org

В Отладчик LLDB (LLDB) это отладчик компонент LLVM проект. Он построен как набор повторно используемых компонентов, которые широко используют существующие библиотеки из LLVM, такие как Лязг парсер выражений и LLVM дизассемблер. LLDB - это бесплатное программное обеспечение с открытым исходным кодом под Лицензия открытого исходного кода Университета Иллинойса / NCSA,[2] а BSD-стиль разрешающая лицензия на программное обеспечение. Начиная с версии 9.0.0, он был перелицензирован на Лицензия Apache 2.0 с исключениями LLVM.[1]

Текущее состояние

LLDB поддерживает отладку программ, написанных на C, Цель-C, и C ++. В Быстрый Сообщество поддерживает версию, в которой добавлена ​​поддержка языка. Известно, что над macOS, Linux, FreeBSD, NetBSD и Windows,[3] и поддерживает i386, x86-64, и РУКА наборы инструкций.[4] LLDB - это отладчик по умолчанию для Xcode 5 и новее. Android Studio также использует LLDB для отладки.[5] LLDB можно использовать из других IDE, включая Код Visual Studio,[6] Затмение,[7] и CLion.[8]

Матрица характеристик [4]
ОсобенностьFreeBSDLinuxmacOSNetBSDWindows
Обратная трассировкададададада
Контрольные точкидадададада
C ++ 11дададада?
Командная строка lldb инструментдадададада
Отладка основного файлададададада
Debugserver (удаленная отладка)НетдададаНет
Разборкададададада
Оценка выражения?Работает с некоторыми ошибкамидаРаботает с некоторыми ошибкамиРаботает с некоторыми ошибками
JIT отладка?Только символьная отладкаНепроверенныйРабота в процессеНет
Цель-C 2.0:?Нет данныхда?Нет данных

Примеры команд

lldb программаОтладка "программы" (из оболочки)
пробегЗапускаем загруженную программу
break set -n mainУстановите точку останова в начале функции "main"
bt Backtrace (в случае сбоя программы)
зарегистрироваться читатьВыгрузить все регистры
di -n mainРазберите функцию "main"

Пример сеанса

Рассмотрим следующую некорректную программу, написанную на C:

#включают <stdio.h>int главный(пустота){  char сообщение = "Привет, мир! п";  printf("% s", сообщение);    возвращаться 0;}

С использованием лязгать компилятор на macOS, приведенный выше код можно скомпилировать с помощью -грамм флаг, чтобы включить соответствующую отладочную информацию о сгенерированном двоичном файле, включая исходный код, что упрощает его проверку с помощью LLDB. Предполагая, что файл, содержащий приведенный выше код, называется test.c, команда для сборник может быть:

$ clang -g test.c -o тест

И теперь двоичный файл можно запустить:

$ ./тестОшибка сегментации

Поскольку пример кода при выполнении генерирует ошибка сегментации, lldb можно использовать для проверки проблемы:

$ lldb тест(lldb) цель создать "тест"Текущий исполняемый файл установлен на «тест» (x86_64).(lldb) пробегЗапущен процесс 70716: '/ Users / wikipedia / test' (x86_64)Процесс 70716 остановлен* поток №1, очередь = 'com.apple.main-thread', причина остановки = EXC_BAD_ACCESS (код = 1, адрес = 0xffffff90)    кадр # 0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18libsystem_platform.dylib`_platform_strlen:-> 0x7fff6c7c46f2 <+18>: pcmpeqb xmm0, xmmword ptr [rdi]    0x7fff6c7c46f6 <+22>: pmovmskb esi, xmm0    0x7fff6c7c46fa <+26>: и rcx, 0xf    0x7fff6c7c46fe <+30>: или rax, -0x1Цель 0: (тест) остановлен.

Проблема возникает при вызове функции Strlen, но мы можем запустить обратный след чтобы определить точную строку кода, которая вызывает проблему:

(lldb) bt* поток №1, очередь = 'com.apple.main-thread', причина остановки = EXC_BAD_ACCESS (код = 1, адрес = 0xffffff90)  * кадр # 0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18    кадр # 1: 0x00007fff6c66b16a libsystem_c.dylib`__vfprintf + 8812    кадр # 2: 0x00007fff6c6911c3 libsystem_c.dylib`__v2printf + 475    кадр # 3: 0x00007fff6c668e22 libsystem_c.dylib`vfprintf_l + 54    кадр # 4: 0x00007fff6c666f72 libsystem_c.dylib`printf + 174    кадр # 5: 0x0000000100000f6d test`main на test.c: 5: 2    кадр # 6: 0x00007fff6c5dc3d5 libdyld.dylib`start + 1(lldb) список источников   3 int main (void) {   4 char msg = "Привет, мир!  N";   5 printf ("% s", сообщение);   6 возврат 0;   7   	}

Со строки, начинающейся с кадр # 5, LLDB указывает, что ошибка находится в строке 5 test.c. Бег список источников, мы видим, что это относится к вызову printf. Согласно коду исключения EXC_BAD_ACCESS из следа, Strlen пытается читать из области памяти, к которой у него нет доступа разыменование неверный указатель.[9] Возвращаясь к исходному коду, видим, что переменная сообщение относится к типу char но содержит строку вместо символа. Чтобы решить эту проблему, мы модифицируем код, чтобы указать, что сообщение это указатель к цепочке символы добавив * оператор:

#включают <stdio.h>int главный(пустота){  char* сообщение = "Привет, мир! п";  printf("% s", сообщение);    возвращаться 0;}

После перекомпиляции и повторного запуска исполняемого файла LLDB теперь дает правильный результат:

(lldb) цель создать "тест"Текущий исполняемый файл установлен на «тест» (x86_64).(lldb) пробегЗапущен процесс 93319: '/ Users / wikipedia / test' (x86_64)Привет, мир!Процесс 93319 завершен со статусом = 0 (0x00000000)(lldb)

LLDB запускает программу, которая распечатывает вывод printf к экрану. После нормального выхода из программы LLDB указывает, что процесс, выполняющий программу, завершился, и выводит статус выхода.

Смотрите также

Рекомендации

  1. ^ а б LICENSE.TXT, llvm.org, получено 2019-09-24
  2. ^ «Лицензия на выпуск LLVM»
  3. ^ "Блог проекта LLVM".
  4. ^ а б «Статус LLDB». Получено 28 ноября, 2019.
  5. ^ https://developer.android.com/studio/debug
  6. ^ «Добавить новый инструмент с именем« lldb-vscode », реализующий протокол адаптера отладки кода Visual Studio».
  7. ^ "CDT / Пользователь / FAQ".
  8. ^ "Блог LLDB CLion".
  9. ^ «Техническое примечание TN2151: Понимание и анализ отчетов о сбоях приложений». Архив документации. Разработчик Apple. Получено 13 февраля 2020.

внешняя ссылка