You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:28:35