DelphiIDE中EStackoverflow异常的故障排除提示

DelphiIDE中EStackoverflow异常的故障排除提示,delphi,ide,stack-overflow,Delphi,Ide,Stack Overflow,我正在运行德尔福2009。当我试图在表单编辑器中查看表单时,我总是遇到堆栈溢出。所以我做了其他人都会做的事。我使用Delphi调试自己,或者更确切地说,调试IDE的另一个实例 所以我知道溢出发生在哪里,我只是不知道该怎么办。此窗体上有一个自定义组件正在拦截对TForm.WindowProc的调用,以便它可以响应某些winapi消息。当组件调用realWindowProc时,堆栈溢出发生 当我在异常上中断时,调用堆栈中充满了数百个对以下对象的调用: delphicoreide120.@Comppa

我正在运行德尔福2009。当我试图在表单编辑器中查看表单时,我总是遇到堆栈溢出。所以我做了其他人都会做的事。我使用Delphi调试自己,或者更确切地说,调试IDE的另一个实例

所以我知道溢出发生在哪里,我只是不知道该怎么办。此窗体上有一个自定义组件正在拦截对
TForm.WindowProc
的调用,以便它可以响应某些winapi消息。当组件调用real
WindowProc
时,堆栈溢出发生

当我在异常上中断时,调用堆栈中充满了数百个对以下对象的调用:

delphicoreide120.@Comppalmgr@TComponentPalettePageItemDelegate@CheckValid
到目前为止,我还没有找到传递给WindowProc的实际消息

任何帮助都将不胜感激

更新

我取得了一些进展。跟踪到似乎要设置此设置的消息。这是WM_CHILDACTIVATE。当此消息被传递到窗体的
WindowProc
时,它会在IDE中引发一系列调用,最终导致堆栈溢出。现在我只需要找出原因。

当异常本身正在生成时(即在单元的
MapFault
ErrorHandler
函数中),或者仅当EStackOverflow已经引发时,您是否可以中断

无法中断时:当调试器启动时,堆栈可能已经部分损坏

如果您可以在这里中断,那么就这样做,然后尝试向上浏览堆栈(更新的Delphi版本更好),以在WindowProc中找到有问题的参数

调试Delphi窗体设计器时;使用双监视器或大屏幕设置非常方便:您可以在监视器的一侧运行有问题的Delphi实例,在另一侧运行调试Delphi实例

编辑:虽然我在回答中提到了
大屏幕
侧面
,但为了使调试步骤更加清晰:

  • 首先,确保Delphi的调试和有问题的实例在视觉上不会重叠
  • 然后慢慢地越来越多地重叠有问题的Delphi实例,直到堆栈溢出

  • --杰伦

    啊!它是我最近安装的第三方组件包,与异常发生的位置完全无关。尝试在新项目中查看空白表单,但结果相同


    程序包的编译或安装出现问题。重新构建/重新安装会使异常消失。

    你能更改组件源吗?@Mason:如果你没有双监视器(是的,我们中的一些人会遇到这种情况:-),请确保应用程序的窗体/窗口不被调试它的IDE窗口覆盖(实际上与双监视器的操作相同)。这将极大地帮助你处理周围的消息,因为你不会得到应用程序切换和重新绘制。