Данная лабораторная работа посвещена изучению инструментов отладки на примере lldb
$ open https://lldb.llvm.org/tutorial.html
- 1. Создать публичный репозиторий с названием lab11 на сервисе GitHub
- 2. Выполнить инструкцию учебного материала
- 3. Ознакомиться со ссылками учебного материала
- 4. Составить отчет и отправить ссылку личным сообщением в Slack
Устанавливаем переменную GITHUB_USERNAME
и короткое имя для команды sed
$ export GITHUB_USERNAME=<имя_пользователя>
$ alias gsed=sed # for *-nix system
Скачиваем репозиторий, переключаемся на ветку lab09
и создаем новую ветку lab11
$ git clone https://github.com/${GITHUB_USERNAME}/Labs lab11
$ cd lab11
$ git checkout lab10
$ git checkout -b lab11
Собираем проект demo
$ cmake -H. -B_build -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=_install
$ cmake --build _build --target install
$ cd _install/bin
Устанавливаем отладчик lldb и производим отладку проекта demo
$ sudo apt install lldb # устанавливаем отладчик
$ lldb demo # устанавливаем цель для работы отладчика
(lldb) target create "demo"
Current executable set to 'demo' (x86_64).
(lldb) process launch --stop-at-entry
Process ${demo_PID} launched: ${demo_PATH}
(lldb) breakpoint list # выводим список точек останова
No breakpoints currently set.
(lldb) breakpoint set --name print # устанавливаем точку останова на функции print
Breakpoint 1: 2 locations.
(lldb) breakpoint set --file demo.cpp --line 6 # устанавливаем точку останова в файле demo.cpp на строке 6
Breakpoint 2: where = demo`main + 102 at demo.cpp:6, address = 0x0000555555555070
(lldb) breakpoint list
Current breakpoints:
1: name = 'print', locations = 2, resolved = 2, hit count = 0
1.1: where = demo`print(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_ofstream<char, std::char_traits<char> >&) + 16 at print.cpp:8, address = 0x00005555555551ca, resolved, hit count = 0
1.2: where = demo`print(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::ostream&) + 16 at print.cpp:4, address = 0x00005555555551a4, resolved, hit count = 0
2: file = 'demo.cpp', line = 6, exact_match = 0, locations = 1, resolved = 1, hit count = 0
2.1: where = demo`main + 102 at demo.cpp:6, address = 0x0000555555555070, resolved, hit count = 0
(lldb) process launch # запускаем процесс с установленными точками останова
(lldb) n # перейти к следующему шагу
(lldb) exit # заканчиваем работу в отладчике
Запускаем demo, просматриваем отчет о работающих процессах и подключаемся к процессу в отладчике
$ demo
<Command>-T
$ ps # просмотреть отчёт о работающих процессах
$ lldb
(lldb) process attach --pid <идентификатор_процесса>
(lldb) process attach --name demo
(lldb) exit
Просматриваем список потоков, производим трассировку потока и проверяем локальные переменные
$ lldb demo
(lldb) process launch --stop-at-entry -- -program_arg "text1 text2 text3"
(lldb) thread list
(lldb) thread backtrace
(lldb) frame variable
(lldb) frame variable argv[0]
Проходим пошагово по каждому методу и процедуре в программе
$ lldb demo
(lldb) process launch --stop-at-entry
(lldb) thread continue
(lldb) thread step-in # производим шаг вперед
(lldb) thread step-over # производим шаг вперед без захода внутрь других методов
(lldb) thread step-out # производим выполнение программы до возвращения из текущей процедуры
(lldb) thread step-inst # производим шаг за шагом по каждой инструкции
(lldb) thread step-over-inst #
(lldb) exit
Вносим изменения в файл README.md
$ cd ../..
$ gsed -i 's/lab10/lab11/g' README.md
Отправляем все изменения в репозиторий
$ git add .
$ git commit -m"debugging"
$ git push origin master
Copyright (c) 2017 Братья Вершинины