Отладка и трассировка
- Хорошая книжка по отладке: https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques 
О структуре исполняемых файлов
ELF:
- nm 
- readelf / objdump 
- ldd (LD_LIBRARY_PATH=, LD_PRELOAD=) 
Что нужно для отладки
- Без оптимизации
- В ассемблерном виде + имена
- Привязка к исходнику — debuginfo 
- То же для всех библиотек - + их исходники
- -debuginfo-версии пакетов с библиотеками 
 
⇒ cc -O0 -g
GDB
* Выполнение
- run 
- continue 
- next 
- step 
- finish 
- advance 
- Точки останова - По номеру строки (оптимизация  ) breakpoint ) breakpoint
- По изменению ячейки (=> выражения) watchpoint 
- По C++-исключению или syscall-у catchpoint 
 
- Просмотр - Ячейки (=> выражения, в т. ч. адресного) print, display, x 
- куска исходника вокруг точки останова list 
- дампа памяти dump 
 
- Стек вызовов - Просмотр backtrace 
- Переход up, down 
 
- …
- статья некоторого товарища, основавшего Школу Хакеров   - Отличный пример оттуда: что и почему выведет такая программа:
 
- Шпаргалка по GDB: https://sourceware.org/gdb/onlinedocs/refcard.pdf 
- https://sourceware.org/gdb/onlinedocs/gdb/index.html}Учебник 
- ptrace_scope и gdb -p 
- gdb-server
Интерфейсы для gdb
Strace
ИРЛ:
- Какие файлы (не) открывает
- Почему висит
- Куда полез в сеть
- Что куда пишет/читает
- …
- Вброс ошибок (например, для тестирования)
- strace — руководство 
Другие похожие инструменты
- cc -fstack-protector-all 
- cc -fsanitize=address 
- (-fno-omit-frame-pointer) 
Огороды памяти
- EFence/DUMA
- *malloc проекты (gperftools, jmalloc, memalloc …)
- libmemleak и ему подобные 
- …
Valgrind
- Полный эмулятор - В т. ч. память
 
- ⇒ отслеживать память, стек и кучу, количество вызовов, кеш процессора, треды.
Утечка памяти не обязательно приводит к ошибке. Порча памяти, к сожалению, тоже.
Д/З
- Установить в сборочное окружение -debuginfo версии библиотек. В разных дистрибутивах могут называться по-разному, приезжать вместе с -devel версиями и даже отсутствовать. В ALT называются libчтототам-debuginfo-версия и лежат в отдельной секции репозитория (вот пример sources.list с сервера практикума) - frbrgeorge@linuxprac ~/src $ grep "^[^#]" /etc/apt/sources.list.d/yandex.list rpm [alt] http://mirror.yandex.ru/altlinux Sisyphus/x86_64 classic debuginfo rpm [alt] http://mirror.yandex.ru/altlinux Sisyphus/x86_64-i586 classic rpm [alt] http://mirror.yandex.ru/altlinux Sisyphus/noarch classic 
- Освоить какой-нибудь вариант отладчика, пройти под ним примеры из лекции
- Упражнение на gdb - Обычный старт для программы на си — b main и r 
- Пошагово, посмотреть различие между s и n 
- С установкой breakpoint на номер строки и на вызов функции (b куда-то и c) 
- Написать программу, которая - 1 раз делает malloc() и два раза — free() 
- При компиляции с -O0 -g падает с double free - (У меня без ключа -O0 даже ошибки не возникало. Оптимизация какая-то!) 
 
- компилируется с -Wall без предупреждений 
 
- Запустить её под отладчиком, поработать с bt и u 
 для любознательных — освоить .gdbinit для любознательных — освоить .gdbinit- (как минимум, вписать туда set history save on) 
 
 
- Создать в репозитории каталог 06_Debugging и положить эту double-free программу туда. 
