在 Linux 中获取每个进程的堆和堆栈大小
Get the size of heap and stack per process in Linux
我想知道 linux 中每个进程的堆和堆栈的大小。有什么办法可以找到吗?
我发现 sbrk(0) 会给我堆末尾。但是如何找到堆的开始以获得堆大小?
关于堆栈大小,是否有任何方法可以通过任何库调用或系统调用找到每个进程的堆栈起始地址和当前堆栈指针地址?
在 Linux 上,您可以阅读 /proc/[PID]/maps
并找到 [heap]
和 [stack]
条目。
但是对于通常在 Linux 上使用的 GLIBC 堆实现,"heap" 包括通过 sbrk()
获得的内存,在 /proc/[PID]/maps
文件中显示为 [heap]
和 通过 mmap()
获得的内存 - 参见 。所以堆的 "size" 将很难确定。
并且 maps
文件中标记为 [stack]
的区域仅是主线程的堆栈。多线程进程将有多个堆栈,每个线程一个。它们将作为匿名内存出现在 maps
文件中——也许吧。应用程序可以通过使用 pthread_attr_setstack()
控制用于线程堆栈的内存,并将其设置为应用程序可能使用的 any 内存。
您可以在下面的文件中获取。您应该是 root 用户。
/proc/<pid>/maps
我想知道 linux 中每个进程的堆和堆栈的大小。有什么办法可以找到吗?
我发现 sbrk(0) 会给我堆末尾。但是如何找到堆的开始以获得堆大小?
关于堆栈大小,是否有任何方法可以通过任何库调用或系统调用找到每个进程的堆栈起始地址和当前堆栈指针地址?
在 Linux 上,您可以阅读 /proc/[PID]/maps
并找到 [heap]
和 [stack]
条目。
但是对于通常在 Linux 上使用的 GLIBC 堆实现,"heap" 包括通过 sbrk()
获得的内存,在 /proc/[PID]/maps
文件中显示为 [heap]
和 通过 mmap()
获得的内存 - 参见
并且 maps
文件中标记为 [stack]
的区域仅是主线程的堆栈。多线程进程将有多个堆栈,每个线程一个。它们将作为匿名内存出现在 maps
文件中——也许吧。应用程序可以通过使用 pthread_attr_setstack()
控制用于线程堆栈的内存,并将其设置为应用程序可能使用的 any 内存。
您可以在下面的文件中获取。您应该是 root 用户。
/proc/<pid>/maps