在systemtap

时间:2018-04-13 11:04:57

标签: systemtap

我正在尝试从systemtap脚本中的系统调用探针转储变量:

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

在像systemtp这样的

之下运行程序之后
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中存储的实际字符串?

1 个答案:

答案 0 :(得分: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