如何确定一个程序在Linux的堆栈大小?

如何确定在Linux中的程序的当前堆栈大小?

据说在Linux中每个程序的堆栈大小都是8MB,但是当你使用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的物理内存空间。