如何在linux中确定程序的堆栈大小?

Sas*_*shi 6 linux multithreading stack-size

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

据说每个程序的堆栈大小在linux中都是8 MB但是当你使用cat/proc // mmap时它会显示不同的大小.

另外,如何确定关联线程的堆栈大小?既然据说线程有自己的私有堆栈?

Ste*_*ker 5

如果您只是想要当前堆栈大小,您可以在 main() 的顶部声明一个变量,获取其地址,并将其与在您定义“当前”的任何位置声明的变量的地址进行比较。差异应该是堆栈增长的大致大小。

如果您想知道为堆栈保留了多少内存,您可以查看 /proc/[pid]/maps,其中有一个区域标记为 [stack]。例如,我的 atd 流程有:

7fff72a41000-7fff72a56000 rw-p 00000000 00:00 0                          [stack]
0175b000-0177c000 rw-p 00000000 00:00 0                                  [heap]
Run Code Online (Sandbox Code Playgroud)

这给了你一个想法。

当我想知道我的程序使用的最大堆栈大小时,一位朋友与我分享的一个巧妙技巧如下。我会在这里展示,以防有人觉得它有用:)

1) 在 main() 开头附近调用的函数中,使用 alloca() 或一个非常长的数组在尽可能多的堆栈上涂抹 0xDEADBEEF 或其他一些不太可能的常量,就像您期望的那样可以使用。当小函数返回时,该内存将被“释放”。

2) 在 main 的末尾,再次使用 alloca() 来抓取一个内存区域并向下“搜索”它以查找您用来涂鸦的任何魔术常量(您可能会尝试找到其中 64 个的第一个块或其他东西)跳过可能已分配但从未使用过的内存区域),并且该指针所在的位置指示您的最大堆栈使用量。

不完美,但它对我正在做的事情很有用!