Часто возникает ситуация: программа подвисает, работает странно или вообще не запускается. В таких случаях на помощь приходят два инструмента -
strace и ltrace. Оба они позволяют заглянуть внутрь процесса, но делают это на разных уровнях.▪️ strace - системные вызовы. strace перехватывает системные вызовы, которые делает процесс, и возвращаемые значения. Это удобно для анализа проблем с доступом к файлам, сетевыми подключениями или зависаниями.
📍 Запуск с приложением:
strace ls /nonexistent
Вывод покажет, что ls пытается открыть директорию и получает ENOENT (нет такого файла).
📍 Подключение к уже работающему процессу:
strace -p 1234
Теперь видно, чем занимается процесс с PID 1234.
📍 Фильтрация вызовов:
strace -e open,read,write -p 1234
Будут показаны только вызовы open, read, write.
▪️ ltrace - вызовы библиотек. Если strace работает с системными вызовами ядра, то ltrace отслеживает вызовы функций библиотек. Это особенно полезно, если программа спотыкается не на уровне ядра, а на уровне glibc или других библиотек.
📍 Пример:
ltrace ls
Вы увидите вызовы функций вроде malloc(), strlen(), fopen().
📍 Фильтрация по конкретным функциям:
ltrace -e malloc,free ./myprog
Будут показаны только вызовы функций управления памятью.
▪️ Совместное применение. Часто эти инструменты используют вместе:
strace → понять, что происходит на уровне системных вызовов (например, программа не может открыть файл из-за прав).
ltrace → отследить логику внутри библиотек (например, неверно передаются параметры в функцию).
▪️ Практические кейсы
📍 Отладка зависающих процессов:
strace -p <PID>
Сразу видно, ждёт ли программа I/O или зациклилась.
📍 Диагностика ошибок "файл не найден":
strace ./prog 2>&1 | grep ENOENT
Можно увидеть, какой именно файл не удаётся открыть.
📍 Поиск утечек памяти:
ltrace -e malloc,free ./prog
Если много malloc(), но мало free() - повод задуматься.
#linux #debug
🧑💻 NetworkAdmin