Инструменты разработчика: отладка и профилирование
Материал упоминает устаревшие версии и утилиты: ifconfig (сейчас — ip), netstat (сейчас — ss), route (сейчас — ip route). Проверьте актуальность для вашей системы.
Инструменты, о которых чаще всего спрашивают: чем поймать падение, чем найти утечку памяти, чем понять, куда программа уходит вместо return. Собрано по назначению, а не по алфавиту.
Отладка: почему программа упала
gdb — консольный отладчик. Основное, что нужно в первые минуты:
$ gdb ./program
(gdb) run # запустить
(gdb) bt # стек: где именно упало
(gdb) frame 2 # перейти на нужный кадр стека
(gdb) print переменная # посмотреть значение
(gdb) break файл.c:42 # точка останова
Если есть core-дамп — gdb ./program core. Если программы много и всё падает «где-то» — catchsegv/ASan (ниже) быстрее, чем ручные точки останова.
valgrind --tool=memcheck — ищет работу с невыделенной и уже освобождённой памятью. Медленно (замедляет в разы), зато находит то, что иначе проявляется раз в неделю. При запуске тестов это лучший способ поймать «испортил память и ушёл дальше».
AddressSanitizer — то же самое, но компилятором, поэтому быстро:
$ gcc -fsanitize=address -g program.c -o program
$ ./program
Трассировка: что программа делает с системой
strace — все системные вызовы: открытия файлов, чтение, сеть, сигналы.
$ strace -f -o trace.log ./program # -f: следить и за потомками
$ strace -e openat,connect ./program # только интересующие вызовы
$ strace -p 1234 # подключиться к работающему процессу
Первое, что смотрят в trace.log при «не запускается»: последний openat, который вернул ENOENT, — файла нет там, где его ищут. При «висит» — последний незавершённый вызов.
ltrace — то же, но про библиотечные вызовы (malloc, strcmp). Полезно, когда подозрение на библиотеку, а не на ядро.
Производительность: где тратится время
| Инструмент | Что показывает |
|---|---|
perf record -g + perf report |
Профиль по функциям и стеку вызовов, работает с ядром и без пересборки |
gprof |
Профиль программы, собранной с -pg — по её собственным функциям |
time |
Грубо: сколько занял запуск целиком (real, user, sys) |
valgrind --tool=callgrind |
Точный счётчик инструкций вместо выборки |
Разница по существу: time отвечает «долго или нет», gprof — «какая моя функция медленная», perf — «где время на самом деле, включая ядро и системные библиотеки».
Сборка
| Инструмент | Назначение |
|---|---|
make / gmake |
Классика: сборка по правилам из Makefile |
cmake |
Генератор сборочных файлов: собирает не проект, а правила сборки |
autotools (autoconf, automake, libtool) |
Переносимые сборочные скрипты для разных систем |
Для разбора ошибок сборки: make -j1 (последовательно, чтобы видеть первую ошибку), make V=1 (показать команды), make -n (не собирать, а напечатать, что было бы сделано).
Наблюдение за системой
Из этого списка часть устарела, и это стоит знать до, а не после:
| Старое | Замена сегодня | Почему |
|---|---|---|
ifconfig |
ip addr, ip link |
ifconfig входит в net-tools, который не развивается годами |
netstat |
ss (ss -tulpn) |
ss работает напрямую с ядром и быстрее на больших таблицах |
route -n |
ip route |
То же семейство: net-tools вытеснен пакетом iproute2 |
Оставшиеся в строю и полезные:
$ lsof -p 1234 # какие файлы и сокеты держит процесс
$ lsof +D /path # кто держит каталог
$ tcpdump -i any -n port 514 # разбор сетевого обмена
lsof — первый инструмент при «файловая система занята» и при «программа не отпускает соединение». tcpdump — когда надо увидеть, что реально уходит в сеть, а не что «должно уходить».
Профилирование памяти
| Инструмент | Что даёт |
|---|---|
valgrind --leak-check=full |
Полный отчёт по утечкам с местом выделения |
mtrace |
Простая проверка пары malloc/free в программе на C |
AddressSanitizer (-fsanitize=address) |
Утечки и выход за границы массива, без замедления в разы |
Связанные разделы
- IDE и редакторы — где это всё запускать удобнее.
- Компиляция — что делает компилятор до запуска отладчика.
- Ресурсы Android —
adbи запуск на устройстве, если программа под Android.
Источники
man 1 gdb,man 1 strace,man 1 ltrace,man 1 valgrind,man 1 perf,man 1 lsof,man 1 tcpdump,man 1 time.man 8 ip,man 8 ss— заменаifconfigиnetstat; NET-TOOLS признан устаревшим в пользуiproute2.man 1 gprof,man 1 mtrace— профилирование и контроль памяти.man 1 make,man 1 cmake— сборка.
Что ещё не проверено
- Инструменты описаны по своим man-страницам; отдельного стенда «поймай утечку и падение» мы не собирали.
- Часть инструментов ставится отдельными пакетами (
gdb,valgrind,strace,ltrace,perf/linux-tools,lsof,tcpdump) — на голой системе их может не быть.
Комментарии
Пока комментариев нет.