Как посмотреть системные вызовы в 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
.
Комментарии
Отправить комментарий