当前位置: 首页 > 面试题库 >

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

金和雅
2023-03-14
问题内容

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

据说每个程序的堆栈大小在Linux中将是8 MB,但是当您使用cat / proc // mmap时,它将显示不同的大小。

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


问题答案:

如果仅需要当前的堆栈大小,则可以在main()的顶部声明一个变量,获取其地址,然后将其与在定义“当前”的位置声明的变量的地址进行比较。差异应为堆栈已增长的近似大小。

如果您想知道为堆栈保留了多少内存,可以检查/ 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个)跳过可能已经分配但从未使用过的内存区域),并且该指针到达的位置指示您的最大堆栈使用率。

并不完美,但是对我的工作很有用!



 类似资料:
  • 我试过下面的程序。创建此程序的目的是了解有关堆栈大小的更多信息。 执行上述代码后,由于堆栈大小分配过大,程序崩溃。堆栈的最大可能大小是多少?是否为每个程序/计算机固定?可以增加吗? 我想知道是为了知识。如果有人能提供C/C中的例子,那将是非常有帮助的。

  • 问题内容: 进程的大小是否有限制?它是否仅取决于机器的性能?我想知道这一点,以限制对函数的递归调用的深度。 谢谢。 问题答案: 堆栈通常受资源限制的限制。您可以使用以下命令查看安装的默认设置: (这表明我的是8MB,这是巨大的)。 如果删除或增加该限制,您仍将无法使用计算机中的所有RAM作为堆栈- 堆栈从进程地址空间顶部附近的一点向下增长,并在某个时刻它将运行到您的代码,堆或已加载的库中。

  • 问题内容: 如果我从Java命令行中省略了该选项,那么将使用默认值。根据Java文档 “根据系统配置在运行时选择默认值” 哪些系统配置设置会影响默认值? 问题答案: 在Windows上,你可以使用以下命令查找运行应用程序的系统上的默认设置。 堆大小 寻找的选项(对),并为。 在系统上,你可以 我相信结果输出以字节为单位。

  • 问题内容: 我正在使用Ubuntu 11.04。如何找出进程的最大调用堆栈大小以及堆栈中每个帧的大小? 问题答案: 您可以使用查询最大进程和堆栈大小。堆栈框架没有固定的尺寸。它取决于每个帧需要多少本地数据(即本地变量)。 要在命令行上执行此操作,可以使用ulimit。 如果要为正在运行的进程读取这些值,我不知道执行此操作的任何工具,但是查询/ proc文件系统很容易:

  • 问题内容: 我知道,如果我在某个从函数某处调用的函数内,那么此返回地址将压入堆栈。 在上面的代码中,当foo函数处于活动状态时,我将获取堆栈中第一个推送的局部变量的地址。我如何访问在此变量堆栈之前的某个地方返回的返回地址(主要称为foo)?该位置是否固定并且可以相对于第一个局部变量访问?我该如何修改? 编辑:我的环境是带有gcc编译器的x86处理器上的Ubuntu 9.04。 问题答案: 有一个内

  • 本文向大家介绍用C ++中的给定操作构造最大堆栈的程序,包括了用C ++中的给定操作构造最大堆栈的程序的使用技巧和注意事项,需要的朋友参考一下 假设我们要制作一个最大的堆栈,它支持以下操作- MaxStk() 这将构造一个最大堆栈的新实例 push(val) 将val插入堆栈 top() 从堆栈中获取最高的元素 max() 从堆栈中获取最大元素 pop() 从堆栈中删除并返回最上面的元素 popm