ltrace — трассировка библиотечных вызовов в Linux

Быстрые ссылки
Что такое библиотека?
что такое ltrace?
Установка ltrace
Использование ltrace
Итоги
Интересуетесь, как исправлять ошибки библиотек и баги, которые появляются при установке нового приложения в Linux? Эта статья покажет, как использовать ltrace — инструмент для отладки библиотечных вызовов и сопутствующих процессов.
Что такое библиотека
Большинство пользователей знакомы с файлами
.dll/.DLLв Windows (Dynamic Link Library). Эквивалент в Linux — файл
.so(Shared Object), часто называемый просто библиотекой.
Определение в одну строку: библиотека — набор готовых функций и данных, которые приложение может использовать без включения их исходников в собственный бинарник.
Библиотеки позволяют приложениям повторно использовать код: например, веб-сервер может вызывать системные функции ввода-вывода из поставляемой ОС библиотеки вместо реализации собственного низкоуровневого кода. Библиотеки бывают двух типов:
- Статически встроенные (compiled-in): код библиотеки включён в исполняемый файл при сборке. Такие вызовы ltrace не увидит.
- Динамически подключаемые (.so): загружаются в память при запуске и вызываются во время выполнения. Именно эти вызовы отслеживает ltrace.
Чтобы посмотреть, с какими библиотеками связан бинарник, полезно знать ldd — инструмент для отображения зависимостей Shared Object.
что такое ltrace
В Linux есть разные трассировщики: strace для системных вызовов и сигналов, traceroute для сетевой трассировки маршрута. ltrace служит для трассировки библиотечных вызовов.
ltrace запускает указанную программу и перехватывает её динамические (внешние) вызовы библиотек, записывая их в вывод. По уровню абстракции это похоже на strace, но ltrace отслеживает вызовы в библиотеках (.so, статические .a не трекаются).
Ключевая идея: ltrace работает «над» исполняемой программой, перехватывая все обращения к внешним библиотекам, а также (опционально) сигналы и порождения дочерних процессов. Опция –no-signals (или коротко -b) отключает отчёт сигналов.
Важно: если бинарник статически линкуется со всеми библиотеками, ltrace не увидит внутренние вызовы — они уже часть исполняемого файла.
Установка ltrace

Установить ltrace можно через менеджер пакетов вашей системы.
Debian/Ubuntu/Mint (APT):
sudo apt install ltraceRHEL/CentOS/Fedora (YUM/DNF):
sudo yum install ltraceПосле установки проверьте версию и базовую справку:
ltrace --version
ltrace --helpИспользование ltrace — пошаговая инструкция и примеры
Ниже — расширённая практическая демонстрация, основанная на примере из оригинала: мы упакуем несколько файлов в tar-архив с компрессией xz и проследим библиотечные вызовы.
Подготовка тестовой среды:
sudo apt install tar xz-utils
mkdir ~/workspace && cd ~/workspace
touch a b cМы установили tar и xz (в CentOS/RHEL/Fedora используйте sudo yum install tar xz), создали каталог ~/workspace и три пустых файла a, b, c.
Запустим упаковку и одновременно ltrace для наблюдения вывода:
ltrace tar -hcf --xz archive.tar.xz *Первичный вывод может быть скудным: программа завершилась с кодом 0 — успех. Однако это не показало внутренних библиотечных вызовов, поскольку tar может запускать внешнюю команду xz как подпроцесс. Иерархия процессов здесь будет выглядеть так: ltrace > tar > xz.
Чтобы отслеживать дочерние процессы, используйте опцию -f (follow forks):
ltrace -f tar -hcf --xz archive.tar.xz *Важно: опции ltrace (например, -f) должны идти перед именем запускаемой программы, иначе они передадутся программе tar, а не ltrace.
Даже с -f вы можете не увидеть системных библиотечных вызовов (тех, что принадлежат системным библиотекам), потому что по умолчанию ltrace не печатает некоторые из них — чтобы избежать избыточного вывода. Проверьте, какие библиотеки используются командами:
whereis tar
whereis xz
ldd /bin/tar
ldd /usr/bin/xzЧтобы включить вывод системных библиотек, добавьте -S:
ltrace -fS tar -hcf --xz archive.tar.xz *Этот вывод может быть очень объёмным. Часто полезно перенаправлять stderr в stdout и фильтровать первые/последние строки:
ltrace -fS tar -hcf --xz archive.tar.xz * 2>&1 | head -n10
ltrace -fS tar -hcf --xz archive.tar.xz * 2>&1 | tail -n10Также есть опция -t для отображения временных меток рядом с каждой записью:
ltrace -fSt tar -hcf --xz archive.tar.xz *(Примечание: синтаксис конкретных опций может отличаться в зависимости от версии ltrace в вашей дистрибуции. Всегда сверяйтесь с ltrace –help.)
Интерпретация вывода ltrace
Вывод ltrace идёт последовательно — сверху вниз в порядке выполнения событий. В нём обычно видны:
- вызовы функций библиотек (имяфункции(args) = возвращаемоезначение)
- сообщения об exec/fork/exit дочерних процессов
- обращения к файлам конфигурации (например, /etc/ld.so.preload)
- сигналы и ошибки, если включены
Пример полезных наблюдений:
- если программа пытается открыть файл конфигурации и получает ENOENT — это указывает на отсутствующий файл;
- если происходит вызов exec для запуска внешней команды, вы увидите новую строку для дочернего процесса;
- если библиотечный вызов возвращает ошибку (-1) и errno указывает на ENOMEM или EACCES — это поможет понять причину отказа.
Частые опции, которые стоит знать
- -f — отслеживать дочерние процессы (fork/exec)
- -S — показывать системные библиотеки (по умолчанию отключено)
- -t — добавлять временные метки к записям
- -o FILE — записать вывод в файл (удобно для последующего анализа)
- -p PID — прикрепиться к уже запущенному процессу
(Если какая-то опция отсутствует в вашей сборке ltrace — проверьте man ltrace или ltrace –help.)
Cheat sheet — команды и шаблоны
Короткая памятка по типовым сценариям:
- Запустить программу под ltrace и сохранить вывод в файл:
ltrace -fS -o ltrace.log myprogram arg1 arg2- Прикрепиться к уже работающему процессу:
ltrace -p 12345 -o attach.log- Отслеживать только определённые функции (фильтрация зависит от версии ltrace*)
ltrace -e 'malloc|free' myprogram- Получить первые/последние строки большого вывода:
ltrace -fS myprogram 2>&1 | head -n50*Примечание: синтаксис фильтров (-e) и возможности могут отличаться между версиями ltrace.
Альтернативы и когда ltrace не помогает
Когда ltrace полезен:
- нужно понять, какие динамические библиотеки вызывает программа;
- нужно отследить взаимодействие с внешними библиотеками или дочерними процессами;
- нужно отловить проблемы конфигурации или загрузки .so.
Когда ltrace не подходит:
- программа статически линкуется — вызовы библиотек встроены в бинарник и невидимы для ltrace;
- требуется трассировка системных вызовов на самом низком уровне (тогда strace лучшая опция);
- нужно отслеживать сетевой трафик — используйте tcpdump/wireshark;
- требуется интерактивная отладка (gdb будет более уместен).
Альтернативы и вспомогательные инструменты:
- strace — трассировка системных вызовов и сигналов;
- ldd — вывод зависимостей .so для бинарника;
- lsof — посмотреть открытые файлы и сокеты процесса;
- readelf/objdump — анализ ELF-бинарников;
- gdb — интерактивная отладка и трассировка внутри процесса.
Рекомендации по отладке: методология (мини‑метод)
- Определите, статически или динамически слинкован бинарник: ldd /path/to/bin.
- Если динамически — запустите ltrace с -f для дочерних процессов.
- Добавьте -S, если подозреваете обращения к системным библиотекам.
- Перенаправьте вывод в файл (-o), чтобы провести анализ офлайн.
- Ищите ошибки (возвращаемые значения, errno), обращения к отсутствующим файлам и exec-вызовы.
- При необходимости используйте strace параллельно, чтобы сравнить системные и библиотечные вызовы.
Роль‑ориентированные чек-листы
Для разработчика:
- Проверить, динамически ли подключена библиотека: ldd
- Запустить тестовые сценарии под ltrace с -fS
- Локализовать место ошибки по возвращаемым значениям и errno
- Подумать о написании unit-теста для проблемной функции
Для администратора/инженера поддержки:
- При повторяющейся ошибке получить ltrace + strace + вывод systemd/journal
- Проверить права доступа к файлам конфигурации и библиотекам
- Проверить SELinux/AppArmor, если доступ к библиотеке запрещён
Типичные ошибки и пути их решения
- «Файл .so не найден» — проверьте LD_LIBRARY_PATH, /etc/ld.so.conf и /etc/ld.so.preload, выполните ldconfig;
- «Permission denied» при открытии .so — проверьте права и SELinux/AppArmor;
- Повторяющиеся ошибки при вызове внешней утилиты (exec) — проверьте наличие утилиты в PATH и права исполнения;
- Если ltrace не показывает ничего — проверьте, не статично ли слинкован бинарник.
Совместимость и миграция
ltrace доступен в большинстве дистрибутивов Linux, но конкретный набор опций и синтаксис фильтров могут отличаться между версиями. При переносе сценариев трассировки между машинами рекомендуем:
- Проверять версию ltrace и man ltrace;
- Воспроизводить вывод на целевой системе и сравнивать результаты;
- При автоматизации использования ltrace сохранять и анализировать выводы, а не полагаться на консольный просмотр.
Безопасность и приватность
ltrace отображает аргументы функций и строки, которые иногда содержат секреты (пароли, токены). Поэтому:
- Не храните логи ltrace в общедоступных местах;
- Фильтруйте и маскируйте чувствительные данные перед отправкой логов сторонним инженерам;
- Учитывайте политику соответствия и хранения логов вашей организации.
Критерии приёмки
- ltrace показывает ожидаемые вызовы внешних библиотек для тестовой задачи.
- Для ошибок — в логах присутствуют строки с ошибочными возвращаемыми значениями/errno.
- Если проблема связана с дочерним процессом — ltrace запущен с -f и показывает exec/fork события.
Краткое резюме
ltrace — удобный инструмент для наблюдения за динамическими вызовами библиотек и поведением дочерних процессов. Он дополняет strace и ldd, помогая понять, какие внешние библиотеки используются программой и где происходят сбои. При работе с ltrace полезны опции -f (follow), -S (показывать системные библиотеки), -t (временные метки) и -o (запись в файл). Не забудьте защищать полученные логи от утечек чувствительных данных.
Важное: если бинарник статически слинкован, ltrace не даст информации о внутренних вызовах — используйте gdb/objdump для анализа такого случая.
Если нужно, могу подготовить:
- готовые команды для конкретного сценария, который у вас случился;
- шаблон скрипта автоматического сбора ltrace+strace логов для инцидентов;
- простую визуализацию (Mermaid) для типичных сценариев взаимодействия ltrace > приложение > дочерние процессы.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента