如何确定 linux 中程序的当前堆栈大小?
据说每个程序的堆栈大小在 linux 中为 8 MB,但是当您使用 cat /proc//mmap 时,它会显示不同的大小。
另外,如何确定相关线程的堆栈大小?既然说线程有自己的私有栈?
如何确定 linux 中程序的当前堆栈大小?
据说每个程序的堆栈大小在 linux 中为 8 MB,但是当您使用 cat /proc//mmap 时,它会显示不同的大小。
另外,如何确定相关线程的堆栈大小?既然说线程有自己的私有栈?
如果您只是想要当前堆栈大小,您可以在 main() 的顶部声明一个变量,获取它的地址,并将其与在您定义“current”的任何位置声明的变量的地址进行比较。差异应该是堆栈增长的近似大小。
如果您想知道为堆栈保留了多少内存,可以查看 /proc/[pid]/maps,其中有一个标记为 [stack] 的区域。例如,我的 atd 进程有:
7fff72a41000-7fff72a56000 rw-p 00000000 00:00 0 [stack]
0175b000-0177c000 rw-p 00000000 00:00 0 [heap]
这给了你一个想法。
当我想知道我的程序使用的堆栈的最大大小时,一位朋友与我分享了一个巧妙的技巧,如下所示。我会在这里展示它以防有人觉得它有用:)
1) 在 main() 开头附近调用的函数中,使用 alloca() 或一个非常长的数组在您期望的尽可能多的堆栈上涂抹 0xDEADBEEF 或其他一些不太可能的常量。当小函数返回时,该内存将被“释放”。
2)在 main 结束时,再次使用 alloca() 来获取内存区域并向下“搜索”以查找您用来乱写的任何魔术常数(您可能会尝试找到其中 64 个的第一个块或其他东西跳过可能已分配但从未使用过的内存区域),并且该指针所在的位置指示您的最大堆栈使用量。
不完美,但它对我正在做的事情很有用!
正如 Steven 所建议的那样,为您的线程保留的堆栈大小与您的线程当前使用的堆栈之间存在差异。
如果您想知道为一个线程保留了多少内存,您可以使用 pthread 属性。
pthread_attr_t attr;
size_t stacksize;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("%u\n", stacksize);
这将打印创建一个线程时保留的默认堆栈大小。对我来说,它是 8 Mb。
您可以使用 pthread_attr_setstacksize() 更改此设置,并将 attr 结构作为 2 个参数传递给 pthread_create 函数。
编辑:也许您还应该注意延迟分配问题。您的 8 Mb 虚拟空间不会使用 8Mb 的物理内存空间,除非您在此内存空间中的任何位置进行读写。
虽然有多种方法可以手动查询 Linux/proc/
等。我最近发现stackusage非常方便,它可以拦截线程的创建并非常精确地显示实际使用情况。也适用于单线程应用程序。