gpt4 book ai didi

c - 如何查找给定地址是在堆中还是在堆栈中

转载 作者:IT王子 更新时间:2023-10-29 00:31:57 25 4
gpt4 key购买 nike

我需要查找给定地址是在堆中还是在堆栈中。在 Linux 中有可靠的方法来做到这一点吗?

我已经考虑过以下方法,假设堆栈将向下增长并且堆将向堆栈增长。这个解决方案有多可靠?我们不使用 gcc split-stack

is_stack (void *addr) {
int a;
if( &a < addr) return stack;
else return heap
}

[编辑 - 我看到了一个类似的问题,但更多的是理论性质]

最佳答案

首先,您的 process 中可能有多个堆栈,特别是如果它是多线程的(并且某些库可以在您不要求的情况下启动线程)。还有你的过程'virtual address space可能有比堆栈更多的段。

您可能会解析 /proc/self/maps伪文件。参见 proc(5) .请注意,由于它是由内核生成的伪文件,因此不涉及物理 IO,并且读取和解析 /proc/self/maps文件应该非常快。

您的进程的地址映射可以通过调用 mmap(2) 来更改, munmap , execve , mprotect和其他一些系统调用(参见 syscalls(2) 获取它们的列表);使用 strace(1)了解完成了哪些系统调用。任何电话 malloc (由许多函数内部调用,包括 fopen ...)或 free (以及 dlopen 等等......)可以(但不会总是)使用它们,所以缓存解析 /proc/self/maps 的结果不是一个可靠的选择。

先尝试 cat /proc/$$/maps终端中的命令(显示您的 shell 虚拟地址空间的描述)。

正如许多人评论的那样,因为 ASLR ,你不知道堆栈和堆的相对位置,即使只有一个堆栈。一个可能的技巧是启动你的 main用一些东西把一些局部变量的地址(或者甚至是 mainargc 第一个参数,或者 argv[0] )放在一些全局 void*stackbottom; 中,然后像您一样比较地址,即测试 if( &a < addr && &a > stackbottom) .注意 Boehm's garbage collector正在做类似的事情。

但最可靠的方法是读取和解析/proc/self/maps这应该相当快并且肯定是一个编程解决方案(内核动态通过/proc/提供有关其状态和进程状态的信息并且不涉及物理 IO阅读它)。

而且,在堆栈上或在堆中仍然是指针的定义不明确的属性(换句话说,堆栈是一个比你想象的)。您需要更准确地了解您真正想做的事情。

或者,重新定义您自己的 malloc , free等等,让你的malloc管理一些内存映射。

关于c - 如何查找给定地址是在堆中还是在堆栈中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33798216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com