SystemTap中如何导出系统调用的数组类型参数(如execve的envp)?
解决SystemTap execve探针中无法显示envp实际内容的问题
我来帮你搞定这个SystemTap里获取execve环境变量的问题~你遇到的情况是因为SystemTap默认不会自动展开指针数组类型的参数(比如envp),所以argstr里只会显示变量数量,直接打印$envp得到的只是用户空间的指针地址,不是实际的环境变量字符串。
解决方法:手动遍历envp数组
envp是一个以NULL结尾的用户空间字符串指针数组,我们需要循环遍历这个数组,用SystemTap的user_string()函数读取每个指针指向的用户空间字符串。修改后的脚本如下:
probe syscall.execve { printf("ARGS: %s\n", argstr) printf("Environment Variables:\n") env_ptr = $envp # 循环遍历直到遇到NULL指针 while (env_ptr != 0) { env_str = user_string(env_ptr) # 空字符串也终止循环(处理异常情况) if (env_str == "") break printf(" %s\n", env_str) # 移动指针到下一个字符串地址(指针大小随系统位数自动适配) env_ptr += sizeof(char*) } }
脚本说明
$envp是内核探针拿到的用户空间指针,必须用user_string()函数读取对应的用户空间字符串,不能直接访问(因为SystemTap运行在内核空间,无法直接读取用户内存)。- 循环终止条件是指针为0(标准的envp数组结尾),同时增加了空字符串判断来避免异常情况。
sizeof(char*)会自动适配32位/64位系统的指针长度,保证指针移动正确。
执行命令
还是用你原来的命令运行即可:
sudo stap -vv -W script.stp -c ./run.sh -o log.txt
运行后,log.txt里就会显示出所有实际的环境变量内容,而不是[/* 6 vars */]啦。
内容的提问来源于stack exchange,提问作者Mikhail Maltsev
相关产品推荐
相关产品推荐

