在Delphi IDE中解决EStackOverflow异常的技巧

4
我正在运行 Delphi 2009。当我尝试在表单编辑器中查看表单时,一直出现堆栈溢出的错误。所以我做了任何人都会做的事情。我使用 Delphi 自身来调试它自己,或者说是另一个 IDE 实例。
因此,我知道了溢出发生的位置,但不知道该怎么办。这个表单上有一个自定义组件,它截取对 TForm.WindowProc 的调用,以便响应某些 WinAPI 消息。当组件调用 真正的 WindowProc 时,就会发生堆栈溢出。
当我在异常处中断时,调用堆栈中充满了数百个调用:
delphicoreide120.@Comppalmgr@TComponentPalettePageItemDelegate@CheckValid

到目前为止,我还没有找到传递给WindowProc的实际消息。如有帮助将不胜感激。
更新:我已经有所进展。追踪到了似乎引发此问题的消息。它是WM_CHILDACTIVATE。当这个消息被传递到窗体的WindowProc时,它会触发IDE中的一系列调用,最终导致堆栈溢出。现在我只需要弄清楚原因。

你能更改组件源吗? - Craig Stuntz
2个回答

3

EStackOverflow异常本身被生成时(即在SysUtils单元的MapFaultErrorHandler函数中),你能否中断程序?或者只有在EStackOverflow已经被触发时才能中断程序?

如果你不能中断程序:当调试器启动时,堆栈可能已经部分损坏。

如果你可以在那里中断程序,请这样做,然后尝试向上浏览堆栈(新版本的Delphi更擅长这方面),以找到WindowProc中的有问题的参数。

在调试Delphi表单设计器时,拥有双显示器或大屏幕设置非常方便:你可以在一个(侧)显示器上运行有问题的Delphi实例,在另一个显示器上运行调试Delphi实例。

编辑:虽然我在回答中提到了large screenside,为了使调试步骤更加清晰:

  1. 首先确保调试和有问题的 Delphi 实例在视觉上不重叠。
  2. 然后慢慢地将有问题的 Delphi 实例逐渐重叠,直到出现堆栈溢出。

--jeroen


1
@Mason:如果你没有双显示器(是的,我们中的一些人遭受了这种痛苦:-),请确保应用程序的窗体/窗口不被IDE窗口覆盖调试它(实际上与双显示器相同)。这将在处理消息时非常有帮助,因为您不会得到应用程序切换和重绘。 - Marjan Venema

1

呃!它竟然是我最近安装的第三方组件包,与异常出现的地方完全无关。尝试在新项目中查看空白表单,结果相同。

编译或安装包时出了些问题。重新构建/安装它可以使异常消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接