Сброс аргумента системного вызова типа массива в systemtap

Я пытаюсь сбросить переменную из зонда системного вызова в сценарии systemtap:

probe syscall.execve
{
  printf("ARGS: %s\n", argstr)
  print($envp)
  print("\n")
}

После запуска такой программы под systemtap

sudo stap -vv -W script.stp -c ./run.sh -o log.txt

Я получаю что-то похожее на следующее (в log.txt):

ARGS: "some-binary-name", ["arg1", "arg2"], [/* 6 vars */]
140089557153664

К сожалению, строка [/* 6 vars */] — это буквально то, что я получаю в журнале, а не фактическое содержимое $envp. И когда я пытаюсь вывести $envp с помощью print, я получаю какое-то числовое значение (вероятно, адрес массива) вместо элементов массива.

Как выгрузить фактические строки, которые хранятся в $envp?


person Mikhail Maltsev    schedule 13.04.2018    source источник


Ответы (1)


Зонды syscall.execve экспортируют переменную скрипта env_str, которая в современном systemtap (здесь 3.2) содержит всю строку окружения, вплоть до предела MAXSTRINGLEN:

 # stap -e 'probe syscall.execve { println(env_str)}'
 ["XDG_SEAT=seat0", "XDG_SESSION_ID=1", "WINDOWPATH=1", "DISPLAY=:0.0", "SYSTEMTAP_SYNC=1", "TMPDIR=/var/tmp", "HOSTNAME=very.elastic.org", "QTLIB=/usr/lib64/qt-3.3/lib", "COLORTERM=truecolor", "LOGNAME=fche", "MODULESHOME=/usr/share/Modules", "VISUAL=vi", "XORG_RUN_AS_USER_OK=1", "SHELL=/bin/zsh", "SCGCINFO=1", "PATH=/home/fche/bin:/home/fche/bin:/home/fche/bin:/usr/libexec/python2-sphinx:/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/home/fche/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/home/fche/bin:/usr/loca

Другой метод заключается в использовании функции env_var для получения определенной переменной среды из текущего процесса. См. man function::env_var:

# stap -e 'probe syscall.execve { println(env_var("PATH")) }'
/home/fche/bin:/usr/libexec/python2-sphinx:/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/home/fche/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/home/fche/bin:/usr/local/sbin:/usr/sbin:/sbin
person fche    schedule 27.04.2018