Как посмотреть системные вызовы в Linux, определить причину отказа в запуске приложения и что такое strace
Чтобы посмотреть системные вызовы, которые осуществляет приложение в Linux, можно использовать утилиту strace. Она позволяет отслеживать системные вызовы и сигналы, которые получает процесс.
Как использовать strace:
Запуск процесса с
strace-f— отслеживать дочерние процессы.-o trace.log— записать вывод в файл для последующего анализа.
Отладка уже запущенного процесса
Если приложение зависло или не работает как ожидается, можно подключиться к нему по PID:Фильтрация системных вызовов
Если интересно только открытие файлов, можно использовать:
Как определить, почему приложение не запускается
Посмотреть ошибки в
strace- Ошибки
ENOENTуказывают на отсутствие файла или библиотеки. - Ошибки
EACCESговорят о проблемах с правами доступа. - Ошибки
ENOMEMозначают нехватку памяти. segfaultилиSIGSEGVуказывает на ошибку в коде приложения.
- Ошибки
Проверить зависимости с помощью
lddЕсли какие-то библиотеки отсутствуют, приложение может не запуститься.
Проверить SELinux/AppArmor
Если в системе включен SELinux, он может блокировать запуск приложения:Проверить права и исполнение
Если у файла нет флага выполнения (
x), его нужно добавить:Проверить ошибки загрузки с
journalctlПопробовать запустить с
gdb(еслиstraceне помогает)
Практический пример
Допустим, у нас есть исполняемый файл my_app, который не запускается.
1. Используем strace
Запускаем программу через strace и сохраняем лог:
Если программа сразу падает с ошибкой, посмотрим последние строки в trace.log:
Пример вывода:
Здесь видно, что программа не может найти libm.so.6.
2. Проверяем зависимости с ldd
Вывод:
Видим, что libm.so.6 не найдена.
3. Ищем библиотеку в системе
Если библиотека есть, но не находится динамическим линкером, добавим путь вручную:
Если библиотеки вообще нет, установим её:
4. Пробуем снова
Запускаем my_app заново:
Если проблема была в библиотеке, теперь программа должна запуститься.
Если всё равно не работает — снова анализируем strace и ldd.

Комментарии
Отправить комментарий