我正在尝试从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
中存储的实际字符串?
答案 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