Отладка и трассировка
Хорошая книжка по отладке: 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 программу туда.