为何本地变量地址不在/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
相关产品推荐
相关产品推荐

