【发布时间】:2012-09-12 09:13:08
【问题描述】:
我有一个截止日期。我正在谷歌搜索,我正在阅读代码,我需要帮助......
我的应用程序正在抛出 EStackOverFlow。它需要通宵测试才能发现错误,所以我需要一些好的想法,否则将需要 很长 时间来追踪。
我昨晚用 MAD except 尝试过,但没有成功,大概是因为没有堆栈可以这样做。我是从 IDE 运行的,所以我中断了执行并查看了调用堆栈,但除了细节之外,它充满了 MAD(我已经联系了作者,但我们之间的时间差很大)。
没有(故意)递归递归例程。没有 OnChange 处理程序(这可能会意外更改它们监视的组件,从而递归调用它们自己)。没有大型数据结构(可能作为参数在堆栈上传递)。
我的第一个想法是关闭 MAD 除外,但我不能再等 12 或 16 个小时才能崩溃。
无人值守,当计时器每 30 秒或每小时到期时,程序正在执行一些数据库访问,所以我将它们设置为 1 秒,希望能加速崩溃。嗯,我可以减少堆栈大小以加速崩溃吗?如果有,怎么做?
我还能做什么?我已经将我的应用程序主文件(创建表单和运行应用程序的地方)包装在 Try ... except 中。
是否有一些点,例如消息处理循环,我可以在其中检查堆栈大小并查看它是否增长“太大”? (如果有,能否提供详细信息?)
还有什么建议吗?提前致谢
(p.s 代码太大,无法发布)
【问题讨论】:
-
您可以在链接器选项(或 $MAXSTACKSIZE)中设置最大堆栈大小(对于可执行文件)。
-
+1 我已将其设置为允许的最小值。对于 XE2,这是 65536。我希望问题会尽快出现。
-
查看类中的“类型数组”字段并搜索“While”和“repeat”循环,这是我过去发现最多问题的地方...
-
JCLDebug 单元(来自 JCL)允许您获取堆栈。您可以使用它来检查堆栈大小。
-
这很奇怪 - 但我尝试了一些 Profiler。怀疑无限递归,我希望最常用的程序是那些参与可怕舞蹈的程序
标签: delphi