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

为何本地变量地址不在/proc/self/maps显示的栈范围内?

问题原因
  • system()函数会创建子进程执行shell命令,子进程拥有独立的地址空间(包括栈)。你通过system()调用cat /proc/self/maps | grep stack时,/proc/self指向的是子进程的PID,输出的[stack]区间是子进程的栈范围,而父进程变量ss的地址属于父进程栈,两者自然不重叠。
解决方案

直接在父进程中读取解析/proc/self/maps,避免创建子进程,就能获取当前进程的栈区间。修改后的测试程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int ss;
    FILE *maps = fopen("/proc/self/maps", "r");
    if (!maps) {
        perror("fopen failed");
        return 1;
    }

    char line[256];
    while (fgets(line, sizeof(line), maps)) {
        if (strstr(line, "[stack]")) {
            printf("%s", line);
            break;
        }
    }
    fclose(maps);

    printf("&ss=%p\n", &ss);
    return 0;
}
验证结果

运行修改后的程序,&ss的地址会落在输出的[stack]区间内,示例输出:

7ffe3e11c000-7ffe3e13e000 rw-p 00000000 00:00 0                          [stack]
&ss=0x7ffe3e13d8a0

此时0x7ffe3e13d8a0处于7ffe3e11c000-7ffe3e13e000区间内。

额外说明

针对保守垃圾回收器开发,还需注意:

  • x86_64架构下栈向下生长,扫描范围应从当前栈指针(可通过内联汇编获取%rsp值)到[stack]区间的高地址。
  • 需处理栈帧结构,避免遗漏或误扫描非当前调用栈的内存区域。

内容的提问来源于stack exchange,提问作者Elektito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:08