LLDB (отладчик) - LLDB (debugger)
Эта статья может чрезмерно полагаться на источники слишком тесно связан с предметом, потенциально препятствуя публикации статьи проверяемый и нейтральный.Февраль 2015 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Разработчики) | Группа разработчиков LLVM |
---|---|
Репозиторий | |
Написано в | C ++ |
Операционная система | macOS i386 и x86-64, Linux, FreeBSD, NetBSD, Windows |
Тип | Отладчик |
Лицензия | UIUC (BSD-стиль ) Лицензия Apache 2.0 с исключениями LLVM (v9.0.0 или новее)[1] |
Интернет сайт | lldb |
В Отладчик 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]
Особенность | FreeBSD | Linux | macOS | NetBSD | Windows |
---|---|---|---|---|---|
Обратная трассировка | |||||
Контрольные точки | |||||
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 указывает, что процесс, выполняющий программу, завершился, и выводит статус выхода.
Смотрите также
Рекомендации
- ^ а б LICENSE.TXT, llvm.org, получено 2019-09-24
- ^ «Лицензия на выпуск LLVM»
- ^ "Блог проекта LLVM".
- ^ а б «Статус LLDB». Получено 28 ноября, 2019.
- ^ https://developer.android.com/studio/debug
- ^ «Добавить новый инструмент с именем« lldb-vscode », реализующий протокол адаптера отладки кода Visual Studio».
- ^ "CDT / Пользователь / FAQ".
- ^ "Блог LLDB CLion".
- ^ «Техническое примечание TN2151: Понимание и анализ отчетов о сбоях приложений». Архив документации. Разработчик Apple. Получено 13 февраля 2020.