LLDB (отладчик)
Эта статья может чрезмерно полагаться на источники, слишком тесно связанные с предметом , что потенциально препятствует тому, чтобы статья была проверяемой и нейтральной . ( февраль 2015 г. ) |
![]() | |
Разработчик(и) | Группа разработчиков LLVM |
---|---|
Стабильная версия | 18.1.8 [1] ![]() |
Репозиторий | |
Написано в | С++ |
Операционная система | macOS i386 и x86-64, Linux , FreeBSD , NetBSD , Windows |
Тип | Отладчик |
Лицензия | UIUC ( в стиле BSD ) Лицензия Apache 2.0 с исключениями LLVM (версия 9.0.0 или новее) [2] |
Веб-сайт | lldb |
( Отладчик 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]
Особенность | 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 указывает, что процесс, запускающий программу, завершился, и выводит статус завершения.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Выпуск 18.1.8» . 19 июня 2024 г. Проверено 15 июля 2024 г.
- ^ Jump up to: а б LICENSE.TXT , llvm.org , получено 24 сентября 2019 г.
- ^ "Лицензия на выпуск LLVM"
- ^ «Блог проекта LLVM» . 20 января 2015 г.
- ^ Jump up to: а б «Статус LLDB» . Проверено 31 января 2022 г.
- ^ «Отладка вашего приложения» .
- ^ «Добавьте новый инструмент с именем «lldb-vscode», который реализует протокол адаптера отладки кода Visual Studio» .
- ^ «В версии 11.3 представлен новый отладчик на основе LLDB для macOS Intel и 32-разрядной версии Android. В версии 11.3 все отладчики платформ, отличных от Windows, в Delphi и C++ перешли на архитектуру LLDB» .
- ^ «CDT/Пользователь/Часто задаваемые вопросы» .
- ^ «Блог LLDB CLion» .
- ^ «Техническое примечание TN2151: Понимание и анализ отчетов о сбоях приложений» . Архив документации . Разработчик Apple . Проверено 13 февраля 2020 г. .
Внешние ссылки
[ редактировать ]- Отладчики
- Бесплатное программное обеспечение, написанное на C++.
- Программное обеспечение, поддерживающее сценарии Lua (язык программирования)
- Программное обеспечение, использующее лицензию NCSA
- Программное обеспечение, использующее лицензию Apache
- Программное обеспечение для разработки видеоигр для Linux