【发布时间】:2011-03-25 08:34:35
【问题描述】:
假设我正常运行一个程序,它调用某个函数(比如 A() ),该函数递归调用自身直到堆栈溢出(这发生在 A() 被调用大约 10 次之后)。如果我在 gdb 下运行相同的程序,即使 A() 被递归调用了 20 次以上,堆栈也没有溢出。是因为我是在gdb下跑的才出现这种情况,还是有其他原因?
编辑:我将复制粘贴我获得的回溯,有任何迹象表明为什么会发生段错误?更大的问题是如何找到它?
【问题讨论】:
-
10 似乎是一个非常少的堆栈溢出调用...
-
你有这样行为的代码吗?
-
不只是 A(),就像 A() -> B() -> C() -> D() 和 D() 调用 A(),所以链继续下去直到堆栈溢出。 (10 不是实际数字,我的意思是即使同一条链在 gdb 中运行更多次,也不会导致溢出。
-
您如何跟踪调用 A 的次数? (例如,如果是通过日志记录,则需要确保在崩溃发生之前刷新输出)。
-
嗯......因为它是一个递归调用并且你正在破坏堆栈,所以你的递归终止逻辑可能不正确......我假设 tcmalloc.cc 是你的代码?你的代码是什么样的,你是如何终止递归的……
标签: c gdb stack-overflow