Ответ
Отладка в 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.