The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Выпуск strace 4.15 с функцией подмены системных вызовов

15.12.2016 08:50

Доступна новая версия утилиты strace 4.15, предназначенной для диагностики и отладки программ в ОС на базе ядра Linux. Утилита позволяет отслеживать и (начиная с данной версии) вмешиваться в процесс взаимодействия программы и ядра, включая происходящие системные вызовы, возникающие сигналы и изменения состояния процесса. Для своей работы strace использует механизм ptrace. Код проекта распространяется под лицензией BSD. Начиная с версии 4.13, формирование выпусков strace синхронизировано с выходом очередных версий Linux.

В версии 4.15 можно отметить следующие изменения:

  • Реализована возможность подмены номера системного вызова и результата вызова, например, для симуляции возникновения ошибок и нештатных ситуаций («fault injection»). Данная функциональность даёт возможность изучать поведение приложений в случае возникновения ошибок при выполнении различных системных вызовов. Например, данная возможность позволила выявить недостаточную проверку кода возврата вызовов 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 +++
    

    Более подробно данная возможность рассмотрена автором прототипной реализации, сделанной в рамках GSoC 2016, и на выступлении «Can strace make you fail?» на Тринадцатой конференции разработчиков свободных программ.

  • Добавлена поддержка декодирования команд ioctl(), связанных с подсистемой 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(), добавленных в Linux 4.9 (см. также).
  • Обновлена поддержка декодирования системных вызовов для архитектур arc, x32 и xtensa.
  • Реструктурирована страница документации strace(1).


  1. Главная ссылка к новости (https://sourceforge.net/p/stra...)
  2. OpenNews: Выпуск strace 4.11
  3. OpenNews: Выпуск strace 4.10
Автор новости: eSyr
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/45689-strace
Ключевые слова: strace, trace, debug
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (6) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Michael Shigorin (ok), 11:39, 15/12/2016 [ответить]  
  • +3 +/
    Вот соответствующий доклад ldv@ и слайды к нему с нашей осенней конференции: http://0x1.tv/201610019
     
  • 1.2, Аноним (-), 12:34, 15/12/2016 [ответить]  
  • +/
    Классное изменение. Подозреваю, что fault injection можно использовать для получения root-а непривилегирвоанным пользвоателем через манипуляции с suid-процессом в strace.
     
     
  • 2.3, hoopoe (ok), 12:50, 15/12/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    это вряд-ли, ptrace не даст дебажить suid-ный процесс
     
  • 2.4, snmp agent (?), 12:52, 15/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Думаю, не получится. man strace:
    Programs that use the setuid bit do not have effective user ID privileges while being traced.
     

  • 1.5, Аноним (-), 12:57, 15/12/2016 [ответить]  
  • +2 +/
    замечательная программа. одна из самых полезных для разработчика и сисадмина.
     
     
  • 2.6, Антон (??), 19:11, 15/12/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Еще бы strace не замедлял бы работу процесса на стролько, что:
    - в prod использовать можно только если все лежит и терять уже нечего
    - исследуемый процесс замедляется настолько что изменяется его работа

    http://www.brendangregg.com/blog/2014-05-11/strace-wow-much-syscall.html

    FreeBSD-шный ktrace такой проблемы не имеет...

    Впрочем в Linux не все так плохо, появился perf trace (впрочем он показывает меньше, чем strace), есть SystemTap (нет "из коробки" в большинстве дистрибутивов). Может быть через eBPF можно будет сделать что то аналогичное.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру