我想知道linux中每个进程的堆和堆栈的大小。有没有办法找到它?
我发现sbrk(0)会给我堆的结尾。但是如何才能找到堆的开头来获取堆大小?
同样在堆栈大小上有没有办法通过任何库调用或系统调用找到每个进程的堆栈开始和当前堆栈指针地址?
答案 0 :(得分:2)
在Linux上,您可以阅读/proc/[PID]/maps
并找到[heap]
和[stack]
条目。
但对于通常在Linux上使用的GLIBC堆实现,“堆”包含通过sbrk()
获得的内存,该内存在/proc/[PID]/maps
文件中显示为[heap]
, 通过mmap()
获得的内存 - 请参阅this quesiton。所以堆的“大小”很难确定。
[stack]
文件中标记为maps
的区域仅是主线程的堆栈。多线程进程将有多个堆栈,每个线程一个堆栈。它们将作为匿名内存显示在maps
文件中 - 也许。应用程序可以通过使用pthread_attr_setstack()
来控制用于线程堆栈的内存,并将其设置为应用程序可能使用的任何内存。
答案 1 :(得分:1)
您可以访问以下文件。你应该是root用户。
/proc/<pid>/maps