C语言 进程虚拟内存中的开始和结束地址



我有一个我写的C程序,我正在尝试制作它的内存图。

如何将进程环境的起始地址和结束地址(在虚拟内存中)打印到屏幕上。

该程序现在并且将始终在Linux上运行,不确定这是否有所不同,但它不需要任何类型的可移植性。

我正在寻找最好只给我一个开始和结束的十六进制地址的东西。

看看 C 编程中的这个例子。

user@linux:~$ cat hello.c 
#include<stdio.h>
int main()
{
 printf("Hello Worldn");
 getchar();
}
user@linux:~$ gcc hello.c -o hello
user@linux:~$ ./hello 
Hello World

打开另一个控制台以查找进程 ID (pid)。按如下方式运行ps命令;使用您的程序名称更改hello

在这种情况下,进程 ID (pid) 2011

user@linux:~$ ps -ef | grep hello | grep -v grep
user      2011  1864  0 17:21 pts/2    00:00:00 ./hello
user@linux:~$ 

然后,使用cat命令检查您的/proc/[pid]/maps文件

user@linux:~$ cat /proc/2011/maps | grep stack
bffeb000-c0000000 rw-p 00000000 00:00 0          [stack]
user@linux:~$ 

或者,您也可以使用 pmap 命令

user@linux:~$ pmap 2011 | grep stack
bffeb000     84K rw---    [ stack ]
user@linux:~$ 

在这两种情况下,我们都可以看到堆栈从地址bffeb000开始

根据您的要求,我认为如果您知道特定进程的 PID,则可以获取其内存映射。使用命令"pmap"获取更多信息 http://linux.die.net/man/1/pmap。

如果你想在你的程序中打印它,那么尝试在函数getpid()的帮助下获取pid;然后使用 system() 调用来执行 pmap 命令。

您可以简单地打印出/proc/[PID]/maps文件的内容,其中[PID]是进程的进程标识符的值(调用getpid()以了解此值是什么)。

最新更新