International conference of developers
and users of free / open source software

strace

Dmitry Levin, Moscow, Russian Federation

LVEE 2016

strace is a diagnostic, debugging and instructional userspace utility for monitoring interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state. This paper gives an overview of strace development, lists the most noteworthy changes made in recent releases and the new features currently being worked on.

Немного цифр

На LVEE 2013 три года назад был представлен обзор проекта strace с 1991 года до середины 2013 года1. Нынешний обзор охватывает значительно более короткий период с середины 2013 года по настоящее время, что позволяет рассказать о некоторых значимых событиях более подробно.

За минувшие три года было выпущено пять версий strace.
Периодичность выпусков постепенно сокращалась с одного раза в год
до одного раза в два-три месяца, одновременно с выпусками ядра Linux.

Интенсивность разработки за эти три года по сравнению с предыдущим
трехлетним периодом выросла в три раза, число авторов коммитов выросло в полтора раза, а число авторов 80% коммитов уменьшилось в два раза. Более подробно статистическая информация о коммитах и их авторах представлена в таблице.

Число коммитов и их авторов по версиям:

дата выпуска номер версии число коммитов число авторов число авторов 80% коммитов
всего в год прежних всего в год
13.04.2010 4.5.20
15.03.2011 4.6 112 122 5 12 13 4
02.05.2012 4.7 400 353 3 11 10 2
03.06.2013 4.8 237 218 4 17 16 3
всего за период 749 238 33 11 2
15.08.2014 4.9 247 206 4 22 18 3
06.03.2015 4.10 400 719 4 15 27 1
21.12.2015 4.11 586 737 5 15 19 1
31.05.2016 4.12 799 1804 5 16 36 1
26.07.2016 4.13 182 1182 4 6 39 1
всего за период 2214 703 8 51 16 1

Что нового

Из наиболее заметных изменений можно отметить следующие нововведения и улучшения.

Добавлены новые параметры:

  • -k (экспериментальный): печать стека вызовов функций трассируемых
    процессов после каждого трассируемого системного вызова;
  • -w сбор статистики по времени, проведенному трассируемыми процессами в системных вызовах;
  • -yy печать протокола и адреса, связанных с трассируемыми сокетами.

Реализована надежная трассировка процессов, использующих различные ABI ядра Linux, в частности, процессов x86 и x32 на x86_64.

Значительно расширена поддержка системного вызова ioctl.

Реализована поддержка всех системных вызовов, поддерживаемых ядром Linux 4.7.

Обнаружены и исправлены все известные на данный момент случаи не вполне корректного декодирования системных вызовов.

Система тестирования strace, в которой три года назад было 5 тестов,
значительно доработана и на данный момент состоит из 314 тестов, покрывающих более 72% строк исходного кода.

В работе

В рамках GSoC 2016 завершается работа над следующими проектами:

  • Structured output: поддержка вывода в машиночитаемом виде в формате JSON;
  • Netlink socket parsers: расширяемый парсер данных, передаваемых через сокеты семейства netlink;
  • Fault injection: многофункциональный инжектор ошибок в системных
    вызовах.

Подробнее об этих проектах можно узнать на сайте GSoC 2016 strace
projects2.

Не strace’ом единым

В процессе доработки системы тестирования strace были обнаружены и
исправлены ошибки в других свободных проектах, в частности,

  • Linux kernel:
    • неправильная работа модуля unix_diag3;
    • неправильный номер системного вызова fgetxattr на архитектуре sh644;
    • неправильный код возврата системного вызова personality на архитектуре sparc645;
    • неправильный номер системного вызова restart_syscall для x32 ABI на архитектуре x86_646;
    • неправильная реализация системных вызовов preadv2 и pwritev2 для x86 ABI на архитектуре x86_647;
    • kernel panic на архитектуре parisc8;
    • kernel panic на ядрах OpenVZ.
  • GNU libc: некорректная обработка кода возврата системного вызова
    personality9;
  • musl libc: некорректное поведение модификатора формата %o в семействе функций printf10.

1 LVEE 2013. strace from upstream point of view

2 GSoC 2016 strace projects

3 unix_diag: fix incorrect sign extension in
unix_lookup_by_ino

4 sh64: fix __NR_fgetxattr

5 sparc64: fix incorrect sign extension in
sys_sparc64_personality

6 x86/signal: Fix restart_syscall number for x32 tasks

7 x86: Use compat version for preadv2 and pwritev2

8 parisc: fix a bug when syscall number of tracee is __NR_Linux_syscalls

9 Fix linux personality syscall wrapper

10 fix printf regression with alt-form octal, default precision

Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license

Back