如何在C语言中打印进程使用的每个字节的内存?

3
我想要实现的是在Linux下通过启动C命令行应用程序来启动进程,然后首先找出进程使用的最低和最高虚拟内存地址,然后使用printf()将它们之间的每个字节作为十六进制值打印出来。这是否可能?
我甚至可以弄清楚自己进程的最低和最高虚拟内存地址吗?
如果我有这些,我想我可以使用指针算术结合printf("%p, &address)打印所有之间的内容。
有什么建议吗?

1
在哪个层面,内核还是用户? - edmz
2
您可以访问 /proc/self/psinfo 获取所需信息,但请不要忘记某些内存块仅是垃圾(例如分配然后释放的块),对此的了解与 RT 实现密切相关。此外,更有组织的数据可在 /proc/self/maps/proc/self/mem 中找到。您甚至可以(如果您的内核支持)直接读取/复制 /proc/self/core。有关详细信息,请查阅 proc(5) - Adriano Repetti
我处于用户级别。也许我应该澄清一下,我的主要问题是如何读取绝对内存地址处的内容。 - JohnnyFromBF
1
你的虚拟内存不一定是连续分配的。如果你访问一个没有映射的范围,你会出现段错误。如果你想访问虚拟地址上的内容,只需将该地址分配给指针(例如 int* foo = (int*)0xDEADBEEF;)。 - slugonamission
@slugonamission 我之前没有考虑到这个事实,但现在有了更深刻的理解,谢谢! - JohnnyFromBF
我已经成功地通过以下方法从32位二进制代码区域的内存中读取了第一个字节:unsigned int * a =(unsigned int *)0x08048000; printf("%02x \ n",(char)* a);这是ELF魔数中的7f。 - JohnnyFromBF
1个回答

0

使用以下命令来使用ps

system("ps aux --sort -rss|grep <your_process_name_or_id>");

我不确定我理解了,这怎么帮助找到内存地址? - Josh Correia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接