Инструменты для разработки на C++
Отладка, профилирование, утечки памяти, статический анализ
Мотивирующая цитата
As soon as we started programming, we found to our surprise that it wasn’t as easy to get programs right as we had thought. We had to discover debugging. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs.
— Maurice Wilkes, 1949
Код для семинара
Жизненный цикл разработчика и бага
Основные способы сбора информации о программе
Выполнение ручных/авто тестов
Логирование
Счетчики
Трассировка
Похожа на логирование. Сложно сформулировать отличия.
Много других инструментов
Проверки времени исполнения
Core dumps
Это файл или несколько файлов, представляющих снимок состояния программы:
Не кросс-платформенны. Но есть Google breakpad.
Отчет об ошибке
Как правило, является архивом, состоящим из:
Профилировщики памяти
Valgrind
Что отслеживает Valgrind memcheck tool
Что не отслеживает Valgrind memcheck tool
Практика
Воспроизведем все основные проблемы в работе с памятью в Valgrind
valgrind --leak-check=full --track-origins=yes ./bin/mem
valgrind --leak-check=full --track-origins=yes ./bin/memtricky
Как Valgrind ищет memory leak’и
Valgrind LEAK SUMMARY
Статический анализ, cppcheck
Пробуем cppcheck
sudo apt-get install cppcheck
cppcheck --enable=all ./src/mem.cpp
cppcheck --enable=all ./src/memtricky.cpp
GDB
GDB старт отладки
# Запускаем процесс сразу под отладчиком
$ gdb ./bin/mem
(gdb) run
# Присоединяемся с запущенному процессу
$./bin/profsys &�$ gdb -p $!
GDB: вход, выход
# Пауза программы и выход в консоль отладки
ctrl+c
(gdb)
# Продолжение исполнения программы
(gdb) continue | c
# Выход из отладчика
(gdb) quit | q
Полезные команды
Полезные команды
Полезные команды
Полезные команды
Cheat sheets с коммандами GDB
Профилировка CPU
Визуализация профиля CPU: call graph
Визуализация профиля CPU: backtrace, text
Linux perf
Мощный профилировщик для Linux. Может профилировать всю ОС сразу.
$ perf record -g ./bin/profus
$ perf report --stdio -g none -i ./perf.data | c++filt
$ perf report --stdio -g graph -i ./perf.data | c++filt