Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编译后您能知道最大堆栈深度吗?_C_Linux_Stack - Fatal编程技术网

C 编译后您能知道最大堆栈深度吗?

C 编译后您能知道最大堆栈深度吗?,c,linux,stack,C,Linux,Stack,有没有一种方法可以在linux环境中轻松监控堆栈深度 考虑一个在Ubuntu中用gcc编译的C语言的基本应用程序 如果您不允许动态内存分配(无malloc/free-ing),该怎么办 编译后您能知道最大堆栈深度吗 NO.考虑一个递归函数,它可以根据输入自称任意次数。在不知道程序的输入是什么的情况下,您无法知道函数可能被调用多少次,一次在最后一次中 我希望可以确定某些程序的最大堆栈深度,但不能确定所有程序的最大堆栈深度 有没有一种方法可以在linux环境中轻松监控堆栈深度 我不知道有什么简单

有没有一种方法可以在linux环境中轻松监控堆栈深度

考虑一个在Ubuntu中用gcc编译的C语言的基本应用程序

如果您不允许动态内存分配(无malloc/free-ing),该怎么办

编译后您能知道最大堆栈深度吗

<强> NO.<强>考虑一个递归函数,它可以根据输入自称任意次数。在不知道程序的输入是什么的情况下,您无法知道函数可能被调用多少次,一次在最后一次中

我希望可以确定某些程序的最大堆栈深度,但不能确定所有程序的最大堆栈深度

有没有一种方法可以在linux环境中轻松监控堆栈深度

我不知道有什么简单的方法可以连续监视堆栈深度,但是您可以使用gdb命令在任何点确定堆栈深度

如果您不允许动态内存分配(无malloc/free-ing),该怎么办


那没什么区别。考虑一个递归Fibonacci函数——它不需要动态分配任何内存,但是堆栈帧的数量将根据输入而变化。

< P>可以进行调用图分析。图中最长的路径是最大堆栈深度。但是,也有一些限制

对于递归函数,所有的赌注都是无效的,递归的深度取决于运行时输入,在编译时分析中不可能推断出这一点。[通过分析调用图并查找自身边,即具有相同源和目标的边,可以检测递归函数的存在。]

此外,如果调用图中存在循环/循环,则会出现相同的问题。[如@Caleb所述:
a()->b()->c()->d()->e()->f()->g()->c()
][利用图论的算法,也可以检测循环的存在。]

调用图的参考:


类似于。通过
malloc
进行的动态内存分配不使用堆栈空间。动态内存分配没有什么区别,因为它不从堆栈分配内存。与递归函数无关。如果程序中没有任何递归调用怎么办?这是一个足够的案例限制,你可以知道你的最大堆栈深度吗?@潜伏者,我同意。递归函数就是一个很好的例子,说明了为什么不能在编译时确定堆栈深度。只需考虑一个函数,就可以很容易地看出堆栈深度如何仅取决于输入。和<代码> FBE()/<代码>是一个简单的,广泛理解的例子,它没有动态分配任何内存。@ Caleb是的,我明白了。我也同意。@ TababyTe,不,考虑两个函数<代码>():<代码> >代码>()(代码)>代码< >代码> b>代码>和<代码> b>代码>调用<代码> < < /代码>。确切地说,它们不是递归的,但是堆栈深度仍然根据编译时未知的条件而变化。接下来,考虑到在组中不是2个函数,可能有30个或40个。只有在能够确定调用图中没有循环时,才能确定最大堆栈深度。不只是递归函数使得无法确定堆栈深度,而是调用图中的任何循环。也就是说,不仅仅是“自边”,还需要考虑像
a()->b()->c()->d()->e()->f()->g()->c()
,这样的循环。@Caleb:好的,谢谢,我已经用您的输入更新了答案。所以如果调用图分析返回“无循环”,我可以知道最大堆栈深度?足够公平的限制?只要您不进行不透明的lib调用,或者在某些操作系统上,不进行系统调用,并且确保不被中断,那么可能。。。