Как отлаживать приложения в Linux?

«Как отлаживать приложения в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Отладка в Linux зависит от этапа: разработка, тестирование или расследование инцидента на production. Вот мой набор инструментов.

1. Отладка на этапе разработки/тестирования:

  • GDB (GNU Debugger) для C/C++/Rust/Go (с DWARF):
    gdb -q ./my_binary
    (gdb) break main.c:42
    (gdb) run --some-flag
    (gdb) backtrace full
    (gdb) info locals
    (gdb) p variable_name
  • Отладка в контейнерах: Использую docker run --cap-add=SYS_PTRACE или в Kubernetes добавляю securityContext.capabilities для ptrace.

2. Расследование сбоев в production (минимальное вмешательство):

  • Анализ логов: Первый шаг — journalctl и логи приложения.
    journalctl -u my-service --since "10 min ago" -f
    tail -f /var/log/myapp/error.log | grep -A 5 -B 5 "ERROR"
  • Анализ системных вызовов (strace): Чтобы понять, что делает процесс (открытие файлов, сетевые соединения).
    strace -ff -p <PID> -o strace.out  # Трассировка всех потоков
    strace -e openat,connect,accept -p <PID>  # Только интересующие вызовы
  • Анализ использования библиотек (ltrace): Полезно, если проблема в сторонней библиотеке.

3. Диагностика проблем с памятью:

  • Valgrind (для тестовых сред):
    valgrind --tool=memcheck --leak-check=full ./my_app
  • В production для Go/Java использую встроенные профилировщики (pprof, jmap) или ebpf-инструменты вроде bpftrace для отслеживания аллокаций без остановки приложения.

4. Отладка сетевых проблем:

    ss -tlnp | grep :<port>  # Кто слушает порт?
    tcpdump -i any port 8080 -w capture.pcap  # Захват трафика

5. Для контейнеризованных приложений основные команды — kubectl logs -f <pod> и kubectl exec -it <pod> -- /bin/sh для доступа внутрь контейнера и запуска strace/tcpdump.