Инструменты разработчика: отладка и профилирование

Программирование

Материал упоминает устаревшие версии и утилиты: 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) Утечки и выход за границы массива, без замедления в разы

Связанные разделы

Источники

  • 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) — на голой системе их может не быть.
Оценка статьи 0

Комментарии

Пока комментариев нет.