Гид по технологиям

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

• 7 min read • Linux • Обновлено 30 Nov 2025
ltrace: трассировка библиотечных вызовов в Linux
ltrace: трассировка библиотечных вызовов в Linux

Схема работы ltrace: перехват и запись динамических библиотечных вызовов

Быстрые ссылки

  • Что такое библиотека?

  • что такое 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 через apt в командной строке

Установить ltrace можно через менеджер пакетов вашей системы.

Debian/Ubuntu/Mint (APT):

sudo apt install ltrace

RHEL/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 — интерактивная отладка и трассировка внутри процесса.

Рекомендации по отладке: методология (мини‑метод)

  1. Определите, статически или динамически слинкован бинарник: ldd /path/to/bin.
  2. Если динамически — запустите ltrace с -f для дочерних процессов.
  3. Добавьте -S, если подозреваете обращения к системным библиотекам.
  4. Перенаправьте вывод в файл (-o), чтобы провести анализ офлайн.
  5. Ищите ошибки (возвращаемые значения, errno), обращения к отсутствующим файлам и exec-вызовы.
  6. При необходимости используйте 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 > приложение > дочерние процессы.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро