【发布时间】:2017-02-28 21:25:06
【问题描述】:
我想知道 linux 中每个进程的堆和堆栈的大小。有什么办法可以找到吗?
我发现 sbrk(0) 会给我堆结束。但是如何找到堆的开头来获取堆大小?
还有关于堆栈大小,有没有办法通过任何库调用或系统调用找到每个进程的堆栈开始和当前堆栈指针地址?
【问题讨论】:
标签: c linux heap-memory stack-memory
我想知道 linux 中每个进程的堆和堆栈的大小。有什么办法可以找到吗?
我发现 sbrk(0) 会给我堆结束。但是如何找到堆的开头来获取堆大小?
还有关于堆栈大小,有没有办法通过任何库调用或系统调用找到每个进程的堆栈开始和当前堆栈指针地址?
【问题讨论】:
标签: c linux heap-memory stack-memory
您可以进入以下文件。你应该是root用户。
/proc/<pid>/maps
【讨论】:
在 Linux 上,您可以阅读 /proc/[PID]/maps 并找到 [heap] 和 [stack] 条目。
但是对于通常在 Linux 上使用的 GLIBC 堆实现,“堆”包括通过 sbrk() 获得的内存,在 /proc/[PID]/maps 文件中显示为 [heap] 和获得的内存通过mmap() - 见this quesiton。所以堆的“大小”将很难确定。
maps 文件中标记为[stack] 的区域仅是主线程的堆栈。多线程进程将有多个堆栈,每个线程一个。它们将作为匿名内存出现在maps 文件中——也许吧。应用程序可以通过使用pthread_attr_setstack() 来控制用于线程堆栈的内存,并将其设置为应用程序可能使用的任何内存。
【讨论】: