有没有办法在linux环境中轻松监控堆栈深度?
考虑在C中使用gcc编译的基本应用程序的情况,在Ubuntu中。
如果你不允许动态内存分配(没有malloc / free-ing)怎么样?
答案 0 :(得分:2)
编译后你能知道你的最大堆栈深度吗?
否。考虑一个递归函数,可能会多次调用自身,具体取决于输入。您无法知道可以调用函数的次数,一次在最后一次,而不知道程序的输入是什么。
我希望有可能确定某些程序的最大堆栈深度,但是您无法确定所有程序的最大堆栈深度。
有没有办法在linux环境中轻松监控堆栈深度?
我不知道连续监控堆栈深度的简单方法,但您可以使用gdb' -stack-info-depth命令在任何点确定堆栈深度。
如果你不允许动态内存分配(没有malloc / free-ing)怎么样?
这并没有什么不同。考虑一个递归的Fibonacci函数 - 它不需要动态分配任何内存,但堆栈帧的数量仍将根据输入而变化。
答案 1 :(得分:0)
可以进行调用图分析。图中最长的路径是最大堆栈深度。但是,有一些限制。
使用递归函数,所有投注都关闭,递归的深度取决于运行时输入,在编译时分析中无法推断出。 [通过分析调用图并查找自身边缘,即具有相同源和目标的边缘,可以检测到递归函数的存在。]
此外,如果调用图中存在循环/循环,则会出现同样的问题。 [正如@Caleb所提到的:a()->b()->c()->d()->e()->f()->g()->c()
] [使用图论中的算法,也可以检测周期的存在。]
致电图的参考: