Урок 24: strace и ltrace — трассировка системных вызовов
Программа зависла, работает медленно или ведёт себя странно — с чего начать расследование? strace — это микроскоп инженеров Linux: он перехватывает каждый системный вызов, который делает программа, и отображает его в реальном времени. ltrace делает то же самое для вызовов библиотек. В NVIDIA, когда
Представьте, что вы следите за ребёнком и записываете каждое его действие: открыл дверь, взял чашку, выпил воду, закрыл дверь. Это и есть strace — он записывает каждое «действие», которое программа просит ядро выполнить. Если ребёнок целую минуту стоит перед закрытой дверью и не двигается — это именно то, что показывает strace: «программа уже минуту заблокирована на open()».
- strace
- Инструмент Linux, который перехватывает и отображает каждый системный вызов программы в реальном времени. Использует системный вызов ядра ptrace(). Незаменим для отладки зависших программ, сбоев и проблем с правами доступа.
- ltrace
- Похож на strace, но фокусируется на вызовах библиотек (libc, libm и т. д.), а не на прямых системных вызовах. Позволяет увидеть вызовы вроде malloc(), printf(), fopen() на уровне библиотеки.
- системный вызов
- Интерфейс между программами пользовательского пространства и ядром. Каждая контролируемая операция (чтение файла, создание сокета, выделение памяти ОС) проходит через syscall. strace показывает их все.
- ioctl
- Универсальный системный вызов для управления устройствами. Драйвер CUDA предоставляет все операции с GPU (выделение VRAM, запуск ядра, NVLink) через ioctl(). strace на CUDA-программе показывает десятки вызовов ioctl.
- ptrace
- Системный вызов, на котором построен strace. Позволяет одному процессу отслеживать, останавливать и инспектировать другой процесс. Отладчики вроде gdb тоже используют ptrace.