Доступна (https://sourceforge.net/p/strace/mailman/message/35550687/) новая версия утилиты strace 4.15 (https://strace.github.com), предназначенной для диагностики и отладки программ в ОС на базе ядра Linux. Утилита позволяет отслеживать и (начиная с данной версии) вмешиваться в процесс взаимодействия программы и ядра, включая происходящие системные вызовы, возникающие сигналы и изменения состояния процесса. Для своей работы strace использует механизм ptrace (http://man7.org/linux/man-pages/man2/ptrace.2.html). Код проекта распространяется (https://github.com/strace/strace) под лицензией BSD. Начиная с версии 4.13, формирование выпусков strace синхронизировано с выходом очередных версий Linux.
В версии 4.15 можно отметить следующие изменения (https://raw.githubusercontent.com/strace/strace/master/NEWS):
- Реализована возможность подмены номера системного вызова и результата вызова («fault injection (https://en.wikipedia.org/wiki/Fault_injection)»). Данная функциональность даёт возможность изучать поведение приложений в случае возникновения ошибок при выполнении различных системных вызовов. Например, данная возможность позволила выявить (https://sourceware.org/bugzilla/show_bug.cgi?id=20831) недостаточную проверку кода возврата вызовов mprotect() в коде glibc dynamic linker:
$ strace -e mprotect -e fault=mprotect:when=1:error=ENOMEM cat
mprotect(0xf774e000, 4096, PROT_NONE) = -1 ENOMEM (Cannot allocate memory) (INJECTED)
mprotect(0xf774f000, 8192, PROT_READ) = 0
mprotect(0x8054000, 4096, PROT_READ) = 0
mprotect(0xf7784000, 4096, PROT_READ) = 0
+++ exited with 0 +++
Более подробно данная возможность рассмотрена (https://brokenpi.pe/tools/strace-fault-injection) автором прототипной реализации, сделанной в рамках GSoC 2016, и на выступлении «Can strace make you fail? (http://0x1.tv/Can_strace_make_you_fail%3F_(%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9_%D0%9B%D0%B5%D0%B2%D0%B8%D0%BD,_OSSDEVCONF-2016))» на Тринадцатой (https://www.altlinux.org/images/7/73/Kaluga-xiii-2016.pdf) конференции разработчиков свободных программ (https://ru.wikipedia.org/wiki/%D0%9A%D0%...).
- Добавлена поддержка декодирования команд ioctl(), связанных с подсистемой device mapper (https://www.kernel.org/doc/Documentation/device-mapper/):
$ strace -e trace=ioctl -v dmsetup ls
ioctl(3, DM_VERSION, {version=4.0.0, data_size=16384, flags=DM_EXISTS_FLAG} => {version=4.27.0, data_size=16384, flags=DM_EXISTS_FLAG}) = 0
ioctl(3, DM_LIST_DEVICES, {version=4.0.0, data_size=16384, data_start=312, flags=DM_EXISTS_FLAG} => {version=4.27.0, data_size=339, data_start=312, flags=DM_EXISTS_FLAG, {dev=makedev(253, 0), name="dm0"}}) = 0
dm0 (253:0)
+++ exited with 0 +++
- Добавлена поддержка декодирования значения аргумента attr системного вызова perf_event_open():
$ strace -e trace=perf_event_open -v perf stat -e kmem:mm_page_pcpu_drain sh -c 'git gc 2>/dev/null'
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=10413, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
perf_event_open({type=PERF_TYPE_TRACEPOINT, size=PERF_ATTR_SIZE_VER3, config=398, sample_period=1, sample_type=PERF_SAMPLE_TIME|PERF_SAMPLE_CPU|PERF_SAMPLE_PERIOD|PERF_SAMPLE_RAW, read_format=PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, disabled=1, inherit=1, pinned=0, exclusive=0, exclusive_user=0, exclude_kernel=0, exclude_hv=0, exclude_idle=0, mmap=0, comm=0, freq=0, inherit_stat=0, enable_on_exec=1, task=0, watermark=0, precise_ip=0 /* arbitrary skid */, mmap_data=0, sample_id_all=0, exclude_host=0, exclude_guest=1, exclude_callchain_kernel=0, exclude_callchain_user=0, mmap2=0, comm_exec=0, use_clockid=0, context_switch=0, write_backward=0, wakeup_events=0, config1=0, config2=0, sample_regs_user=0}, 10414, -1, -1, 0) = 3
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=10414, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
Performance counter stats for 'sh -c git gc 2>/dev/null':
7,006 kmem:mm_page_pcpu_drain
2.207781396 seconds time elapsed
--- SIGCHLD {si_signo=SIGCHLD, si_code=SI_USER, si_pid=10412, si_uid=0} ---
+++ exited with 0 +++
- Добавлена поддержка декодирования системных вызовов pkey_alloc(), pkey_free() и pkey_mprotect(), добавленных (https://lwn.net/Articles/689395/) в Linux 4.9 (см. также (https://lwn.net/Articles/667156/)).
- Обновлена поддержка декодирования системных вызовов для архитектур arc, x32 и xtensa.
- Реструктурирована страница документации strace(1).
URL: https://sourceforge.net/p/strace/mailman/message/35550687/
Новость: http://www.opennet.dev/opennews/art.shtml?num=45689