Отладка и трассировка
Хорошая книжка по отладке: 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 По изменению ячейки (=> выражения) 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 (как минимум, вписать туда set history save on)
Создать в репозитории каталог 06_Debugging и положить эту double-free программу туда.
