Jump to content

LLDB (отладчик)

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

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

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

[ редактировать ]

LLDB поддерживает отладку программ, написанных на C , Objective-C и C++ . Сообщество Swift поддерживает версию, в которой добавлена ​​поддержка языка. Free Pascal и Lazarus IDE могут использовать LLDB в качестве бэкэнда для своего собственного движка FpDebug.

Известно, что отладчик LLDB работает в macOS , Linux , FreeBSD , NetBSD и Windows . [4] и поддерживает i386 , x86-64 и ARM наборы инструкций . [5] LLDB — это отладчик по умолчанию для Xcode 5 и более поздних версий. Android Studio также использует LLDB для отладки. [6] LLDB можно использовать из других IDE, включая Visual Studio Code , [7] C++Builder , [8] Затмение , [9] и CLion . [10]

Матрица характеристик [5]
Особенность FreeBSD Линукс macOS NetBSD Окна
обратная трассировка Да Да Да Да Да
Точки останова Да Да Да Да Да
С++11 Да Да Да Да ?
командной строки Инструмент lldb Да Да Да Да Да
Отладка основного файла Да Да Да Да Да
Сервер отладки (удаленная отладка) Да Да Да Да Нет
Разборка Да Да Да Да Да
Оценка выражения Работает с некоторыми ошибками Работает с некоторыми ошибками Да Работает с некоторыми ошибками Работает с некоторыми ошибками
JIT- отладка ? Только символическая отладка Непроверенный Работа в процессе Нет
Цель-C 2.0: ? Да ?

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

[ редактировать ]
lldb program Отладка «программы» (из оболочки)
run Запускаем загруженную программу
break set -n main Установите точку останова в начале функции «main».
bt Backtrace (в случае сбоя программы)
register read Дамп всех регистров
di -n main Дизассемблируем функцию «main»

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

[ редактировать ]

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

#include <stdio.h>

int main(void)
{
  char msg = "Hello, world!\n";
  printf("%s", msg);

  return 0;
}

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

$ clang -Wno-error=int-conversion -g test.c -o test

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

$ ./test
Segmentation fault

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

$ lldb test
(lldb) target create "test"
Current executable set to 'test' (x86_64).
(lldb) run
Process 70716 launched: '/Users/wikipedia/test' (x86_64)
Process 70716 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xffffff90)
    frame #0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18
libsystem_platform.dylib`_platform_strlen:
->  0x7fff6c7c46f2 <+18>: pcmpeqb xmm0, xmmword ptr [rdi]
    0x7fff6c7c46f6 <+22>: pmovmskb esi, xmm0
    0x7fff6c7c46fa <+26>: and    rcx, 0xf
    0x7fff6c7c46fe <+30>: or     rax, -0x1
Target 0: (test) stopped.

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

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xffffff90)
  * frame #0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18
    frame #1: 0x00007fff6c66b16a libsystem_c.dylib`__vfprintf + 8812
    frame #2: 0x00007fff6c6911c3 libsystem_c.dylib`__v2printf + 475
    frame #3: 0x00007fff6c668e22 libsystem_c.dylib`vfprintf_l + 54
    frame #4: 0x00007fff6c666f72 libsystem_c.dylib`printf + 174
    frame #5: 0x0000000100000f6d test`main at test.c:5:2
    frame #6: 0x00007fff6c5dc3d5 libdyld.dylib`start + 1
(lldb) source list
   3   	int main(void) {
   4   		char msg = "Hello, world!\n";
   5   		printf("%s", msg);
   6   		return 0;
   7   	}

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

#include <stdio.h>

int main(void)
{
  char* msg = "Hello, world!\n";
  printf("%s", msg);

  return 0;
}

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

(lldb) target create "test"
Current executable set to 'test' (x86_64).
(lldb) run
Process 93319 launched: '/Users/wikipedia/test' (x86_64)
Hello, world!
Process 93319 exited with status = 0 (0x00000000)
(lldb)

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

См. также

[ редактировать ]
  1. ^ «Выпуск 18.1.8» . 19 июня 2024 г. Проверено 15 июля 2024 г.
  2. ^ Jump up to: а б LICENSE.TXT , llvm.org , получено 24 сентября 2019 г.
  3. ^ "Лицензия на выпуск LLVM"
  4. ^ «Блог проекта LLVM» . 20 января 2015 г.
  5. ^ Jump up to: а б «Статус LLDB» . Проверено 31 января 2022 г.
  6. ^ «Отладка вашего приложения» .
  7. ^ «Добавьте новый инструмент с именем «lldb-vscode», который реализует протокол адаптера отладки кода Visual Studio» .
  8. ^ «В версии 11.3 представлен новый отладчик на основе LLDB для macOS Intel и 32-разрядной версии Android. В версии 11.3 все отладчики платформ, отличных от Windows, в Delphi и C++ перешли на архитектуру LLDB» .
  9. ^ «CDT/Пользователь/Часто задаваемые вопросы» .
  10. ^ «Блог LLDB CLion» .
  11. ^ «Техническое примечание TN2151: Понимание и анализ отчетов о сбоях приложений» . Архив документации . Разработчик Apple . Проверено 13 февраля 2020 г. .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c26b036559ab928dff339935c6943c93__1716388560
URL1:https://arc.ask3.ru/arc/aa/c2/93/c26b036559ab928dff339935c6943c93.html
Заголовок, (Title) документа по адресу, URL1:
LLDB (debugger) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)