К основному контенту

Как посмотреть системные вызовы в Linux, определить причину отказа в запуске приложения и что такое strace

Чтобы посмотреть системные вызовы, которые осуществляет приложение в Linux, можно использовать утилиту strace. Она позволяет отслеживать системные вызовы и сигналы, которые получает процесс.

Как использовать strace:

  1. Запуск процесса с strace

    strace -f -o trace.log ./my_application
    • -f — отслеживать дочерние процессы.
    • -o trace.log — записать вывод в файл для последующего анализа.
  2. Отладка уже запущенного процесса
    Если приложение зависло или не работает как ожидается, можно подключиться к нему по PID:

    strace -p <PID>
  3. Фильтрация системных вызовов
    Если интересно только открытие файлов, можно использовать:

    strace -e open,openat,read,write ./my_application

Как определить, почему приложение не запускается

  1. Посмотреть ошибки в strace

    • Ошибки ENOENT указывают на отсутствие файла или библиотеки.
    • Ошибки EACCES говорят о проблемах с правами доступа.
    • Ошибки ENOMEM означают нехватку памяти.
    • segfault или SIGSEGV указывает на ошибку в коде приложения.
  2. Проверить зависимости с помощью ldd

    ldd ./my_application

    Если какие-то библиотеки отсутствуют, приложение может не запуститься.

  3. Проверить SELinux/AppArmor
    Если в системе включен SELinux, он может блокировать запуск приложения:

    dmesg | grep -i denied
  4. Проверить права и исполнение

    ls -l ./my_application

    Если у файла нет флага выполнения (x), его нужно добавить:

    chmod +x ./my_application
  5. Проверить ошибки загрузки с journalctl

    journalctl -xe
  6. Попробовать запустить с gdb (если strace не помогает)

    gdb --args ./my_application (gdb) run

Практический пример

Допустим, у нас есть исполняемый файл my_app, который не запускается.

1. Используем strace

Запускаем программу через strace и сохраняем лог:

strace -f -o trace.log ./my_app

Если программа сразу падает с ошибкой, посмотрим последние строки в trace.log:

tail -20 trace.log

Пример вывода:

openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) write(2, "error while loading shared libraries: libm.so.6: cannot open shared object file: No such file or directory\n", 120) = 120

Здесь видно, что программа не может найти libm.so.6.


2. Проверяем зависимости с ldd

ldd ./my_app

Вывод:

libm.so.6 => not found libc.so.6 => /lib64/libc.so.6 (0x00007f8b3a3f1000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8b3a3ce000)

Видим, что libm.so.6 не найдена.


3. Ищем библиотеку в системе

find /lib /usr/lib /lib64 /usr/lib64 -name "libm.so*"

Если библиотека есть, но не находится динамическим линкером, добавим путь вручную:

export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH

Если библиотеки вообще нет, установим её:

sudo apt-get install libc6 # или для CentOS/RHEL sudo yum install glibc

4. Пробуем снова

Запускаем my_app заново:

./my_app

Если проблема была в библиотеке, теперь программа должна запуститься.

Если всё равно не работает — снова анализируем strace и ldd.

Комментарии

Популярные сообщения из этого блога

Настройка и подключение IPSec в Windows

Настройка IPSec на Windows включает в себя создание правил безопасности и фильтров для защиты сетевого трафика. Ниже — пошаговое руководство. Включение службы IPSec Перед настройкой убедитесь, что служба IPSec Policy Agent запущена: Нажмите Win + R , введите services.msc и нажмите Enter . Найдите IPsec Policy Agent . Если она не работает, нажмите ПКМ → Свойства . Установите Тип запуска: Автоматически , затем нажмите Запустить . Настройка политики IPSec через «Локальную политику безопасности» Нажмите Win + R , введите secpol.msc , нажмите Enter . Перейдите в Политики IP-безопасности в локальном компьютере . В правом окне нажмите Создать политику IP-безопасности → Далее . Укажите имя политики (например, "IPSec VPN"), снимите флажок Активировать правило по умолчанию , нажмите Далее . Нажмите Добавить , чтобы создать правило. Транспортный или туннельный режим : Если IPSec для защищенной локальной сети – выберите Транспортный режим . Если IPSec для VPN – выберите Туннельн...

Как найти и изменить репозитарии для CentOS 8

В CentOS 8 официальные репозитории (BaseOS, AppStream и Extras) управляются с помощью dnf и файлов конфигурации в /etc/yum.repos.d/ . Вот как их найти и изменить: 1. Просмотр текущих репозиториев dnf repolist Если нужно увидеть подробную информацию: dnf repolist all 2. Изменение репозиториев Файлы конфигурации репозиториев находятся в /etc/yum.repos.d/ . Например, основной репозиторий может быть в файле CentOS-AppStream.repo . Открыть его можно так: nano /etc/yum.repos.d/CentOS-AppStream.repo Внутри можно изменить: enabled=1 → включает репозиторий enabled=0 → отключает репозиторий baseurl= или mirrorlist= → задать новый источник пакетов 3. Замена недоступных репозиториев CentOS 8 достиг конца поддержки , и официальные зеркала больше не работают. Вместо них можно подключить Vault или AlmaLinux/Rocky Linux : Использование архивного репозитория CentOS Vault Создайте резервную копию старых .repo файлов: mkdir /root/repo-backup && mv /etc/yum.repos.d/*.repo /root/repo-backu...

Что такое Redfish API? Развертывание серверов через Redfish API: подробное руководство с примерами

Введение в Redfish API Redfish API — это стандартный интерфейс управления серверами, разработанный DMTF (Distributed Management Task Force). Он предоставляет RESTful API для взаимодействия с серверными системами, включая включение/выключение, мониторинг состояния и развертывание операционной системы. Этот API позволяет автоматизировать управление серверами без необходимости физического доступа или использования устаревших интерфейсов, таких как IPMI. Требования Прежде чем приступить к работе, необходимо подготовить следующее: Сервер с поддержкой Redfish (например, HPE iLO, Dell iDRAC, Lenovo XClarity, Cisco UCS и др.). Доступ к Redfish API через сеть. Учетные данные для аутентификации. Инструмент для работы с API (cURL, Postman, Python с библиотекой requests ). Подключение и аутентификация Для взаимодействия с Redfish API используется стандартный HTTP-запрос с аутентификацией по логину и паролю. Например, для проверки работоспособности интерфейса можно выполнить GET-запрос ...