Delphi中的外部异常EEFFACE
在使用Delphi 2009调试我的应用程序时,我有时会发生以下异常:
这是什么? http://www.beholdgenealogy.com/img/ideexception.gif
这只会偶尔发生,但在按OK后,我的IDE和程序都可能会冻结。 如果我很幸运,我可以在Delphi中做一个File / SaveAll,但有时候我不能。 无论哪种方式,我卡住了,然后我唯一能做的就是使用Windows任务管理器关闭Delphi。 当然,如果我无法SaveAll,那么我将失去自上次保存后所做的所有编辑。
我已经安装了包括Update 4在内的所有Delphi 2009更新。我还安装了IDE Fix Pack 2009 2.9。
错误被EurekaLog困住了,错误报告给出了以下调用堆栈:
Call Stack Information:
-----------------------------------------------------------------------------------------------------------
|Address |Module |Unit |Class |Procedure/Method |Line |
-----------------------------------------------------------------------------------------------------------
|Running Thread: ID=5068; Priority=0; Class=; [Main] |
|---------------------------------------------------------------------------------------------------------|
|205669C6|dbkdebugide120.bpl |Debug.pas |TDebugger |DBKWndProc |11598[6] |
|777DE49A|ntdll.dll | | |KiUserExceptionDispatcher | |
|7705E0CB|kernel32.dll | | |RaiseException | |
|03E8E3E8|dcc120.dll |WRITEOBJ.OBJ | |C62_0 | |
|03E3066D|dcc120.dll |SYMTAB.OBJ | |MakeOverloadedPropertyList| |
|03E3064C|dcc120.dll |SYMTAB.OBJ | |MakeOverloadedPropertyList| |
|03E30D76|dcc120.dll |SYMTAB.OBJ | |EnterMethod | |
|03E30D6C|dcc120.dll |SYMTAB.OBJ | |FindBaseClassMethod | |
|03DE8D30|dcc120.dll |DECL.OBJ | |PatchConstRecordParameter | |
|777DE590|ntdll.dll | | |RtlLeaveCriticalSection | |
|03DBBF70|dcc120.dll |BROWCMGR.OBJ | |PutToAddress | |
|03DBC436|dcc120.dll |BROWCMGR.OBJ | |GetNearestSymName | |
|777DE550|ntdll.dll | | |RtlEnterCriticalSection | |
|219C5BDA|win32debugide120.bpl|Win32Debug.pas |TWin32LinkUnit |GetCppDebugHook |1923[3] |
|219C5BB8|win32debugide120.bpl|Win32Debug.pas |TWin32LinkUnit |GetCppDebugHook |1920[0] |
|219C644E|win32debugide120.bpl|Win32Debug.pas |TWin32Process |DoLinkUnitCreated |2198[10] |
|50001CE4|rtl120.bpl |System.pas | |InterlockedIncrement |3200[0] |
|5000CD59|rtl120.bpl |System.pas |TInterfacedObject |_AddRef |21759[1] |
|2055F40F|dbkdebugide120.bpl |Debug.pas |TProcess |LinkUnitCreated |8454[1] |
|2055F408|dbkdebugide120.bpl |Debug.pas |TProcess |LinkUnitCreated |8453[0] |
|2055CEC7|dbkdebugide120.bpl |Debug.pas |TEvaluatorCallback|ntfyLinkUnitDelta |7167[7] |
|77050DF0|kernel32.dll | | |VirtualProtect | |
|50003FE4|rtl120.bpl |System.pas | |_ReallocMem |3512[0] |
|500093F6|rtl120.bpl |System.pas | |_LStrSetLength |15889[38]|
|50004508|rtl120.bpl |System.pas | |Move |4414[0] |
|5001DDB9|rtl120.bpl |SysUtils.pas | |StrLCopy |7852[5] |
|5007E559|rtl120.bpl |UxTheme.pas | |DrawThemeTextEx |5226[2] |
|5007E524|rtl120.bpl |UxTheme.pas | |DrawThemeTextEx |5224[0] |
|2110A98D|vclactnband120.bpl |ThemedActnCtrls.pas|TThemedMenuButton |DoDrawText |488[23] |
|50009E88|rtl120.bpl |System.pas | |_UStrClr |16961[0] |
|2110A9A2|vclactnband120.bpl |ThemedActnCtrls.pas|TThemedMenuButton |DoDrawText |490[25] |
|75FC7BFE|USER32.dll | | |CallNextHookEx | |
|20AA9C5E|designide120.bpl |DeskUtil.pas | |SetFocusHook |435[4] |
|210E8B83|vclactnband120.bpl |ActnMenus.pas | |CallWindowHook |741[20] |
|50057F7D|rtl120.bpl |Classes.pas |TComponent |UpdateAction |11881[1] |
|50006EE4|rtl120.bpl |System.pas | |_CallDynaInst |10209[0] |
|501EA802|vcl120.bpl |Forms.pas | |ProcessUpdate |6739[1] |
|50006F3C|rtl120.bpl |System.pas |TObject |InheritsFrom |10281[0] |
|50006E1A|rtl120.bpl |System.pas | |_IsClass |10107[1] |
|50006E0C|rtl120.bpl |System.pas | |_IsClass |10106[0] |
|501EA870|vcl120.bpl |Forms.pas | |TraverseClients3 |6756[5] |
|501EA818|vcl120.bpl |Forms.pas | |TraverseClients3 |6751[0] |
|501EA88A|vcl120.bpl |Forms.pas | |TraverseClients3 |6756[5] |
|50047748|rtl120.bpl |Classes.pas |TList |Get |3366[0] |
|501C865E|vcl120.bpl |Controls.pas |TWinControl |GetControl |8473[4] |
|50006F3C|rtl120.bpl |System.pas |TObject |InheritsFrom |10281[0] |
|50006E1A|rtl120.bpl |System.pas | |_IsClass |10107[1] |
|501C8668|vcl120.bpl |Controls.pas |TWinControl |GetControlCount |8478[0] |
|501EA87B|vcl120.bpl |Forms.pas | |TraverseClients3 |6756[5] |
|501EA818|vcl120.bpl |Forms.pas | |TraverseClients3 |6751[0] |
|501EA8E2|vcl120.bpl |Forms.pas |TCustomForm |CMActionUpdate |6778[11] |
|501C565A|vcl120.bpl |Controls.pas |TControl |WndProc |6642[91] |
|501C5388|vcl120.bpl |Controls.pas |TControl |WndProc |6551[0] |
|501C9CE7|vcl120.bpl |Controls.pas |TWinControl |WndProc |9336[136]|
|75FC7C2B|USER32.dll | | |CallNextHookEx | |
|75FCC477|USER32.dll | | |InvalidateRect | |
|75FCC41E|USER32.dll | | |InvalidateRect | |
|75FCC49D|USER32.dll | | |CallWindowProcW | |
|75FCC487|USER32.dll | | |CallWindowProcW | |
|205669A5|dbkdebugide120.bpl |Debug.pas |TDebugger |DBKWndProc |11595[3] |
|500591DC|rtl120.bpl |Classes.pas | |StdWndProc |12703[8] |
|75FC9467|USER32.dll | | |IsWindowVisible | |
|75FC8B0B|USER32.dll | | |DispatchMessageW | |
|75FC8B01|USER32.dll | | |DispatchMessageW | |
|501EEABD|vcl120.bpl |Forms.pas |TApplication |ProcessMessage |9660[30] |
|501EE9A0|vcl120.bpl |Forms.pas |TApplication |ProcessMessage |9630[0] |
|501EEB02|vcl120.bpl |Forms.pas |TApplication |HandleMessage |9690[1] |
|501EEAF8|vcl120.bpl |Forms.pas |TApplication |HandleMessage |9689[0] |
|501EEE2D|vcl120.bpl |Forms.pas |TApplication |Run |9827[26] |
|501EED64|vcl120.bpl |Forms.pas |TApplication |Run |9801[0] |
|004259E6|bds.exe |bds.dpr | |bds |198[8] |
|770CECC9|kernel32.dll | | |BaseThreadInitThunk | |
-----------------------------------------------------------------------------------------------------------
正如你所看到的,所有的调用堆栈都在Delphi和Windows中。 它根本不连接到我的程序中的任何行。
我查看了网页:External Exception EEFFACE并将其从德语翻译成英语,但它似乎在谈论Delphi C ++,而我根本不使用C ++。
我的问题是我不知道什么可能会导致这种情况,因为它不会一致发生。 我甚至不知道在哪里寻找它或如何追踪它。
有人知道这是什么以及我如何追踪或至少防止它发生?
EurekaLog的Alex在他们的论坛发布了这个回应我的查询:
我认为这可能是Delphi调试器中的一个错误。 可能与评估工具提示或类似的东西有关。
自己看看 - 我们在系统模块中有一个C ++异常(EEFFACE是VCL异常的特殊代码,当VCL遇到一个未知的C ++异常 - 它将它封装到代码为EEFFACE的EExternalException对象中)并且调用堆栈包含Delphi调试器的单元:
|205669C6|dbkdebugide120.bpl |Debug.pas |TDebugger |DBKWndProc |11598[6] |
|7705E0CB|kernel32.dll | | |RaiseException | |
|03E8E3E8|dcc120.dll |WRITEOBJ.OBJ | |C62_0 | |
|03E3066D|dcc120.dll |SYMTAB.OBJ | |MakeOverloadedPropertyList| |
|03E3064C|dcc120.dll |SYMTAB.OBJ | |MakeOverloadedPropertyList| |
|03E30D76|dcc120.dll |SYMTAB.OBJ | |EnterMethod | |
|03E30D6C|dcc120.dll |SYMTAB.OBJ | |FindBaseClassMethod | |
|03DE8D30|dcc120.dll |DECL.OBJ | |PatchConstRecordParameter | |
|03DBBF70|dcc120.dll |BROWCMGR.OBJ | |PutToAddress | |
|03DBC436|dcc120.dll |BROWCMGR.OBJ | |GetNearestSymName | |
|219C5BDA|win32debugide120.bpl|Win32Debug.pas |TWin32LinkUnit |GetCppDebugHook |1923[3] |
|219C5BB8|win32debugide120.bpl|Win32Debug.pas |TWin32LinkUnit |GetCppDebugHook |1920[0] |
|219C644E|win32debugide120.bpl|Win32Debug.pas |TWin32Process |DoLinkUnitCreated |2198[10] |
|50001CE4|rtl120.bpl |System.pas | |InterlockedIncrement |3200[0] |
|5000CD59|rtl120.bpl |System.pas |TInterfacedObject |_AddRef |21759[1] |
|2055F40F|dbkdebugide120.bpl |Debug.pas |TProcess |LinkUnitCreated |8454[1] |
|2055F408|dbkdebugide120.bpl |Debug.pas |TProcess |LinkUnitCreated |8453[0] |
|2055CEC7|dbkdebugide120.bpl |Debug.pas |TEvaluatorCallback|ntfyLinkUnitDelta |7167[7] |
我认为你应该把这个描述发布到Embarcadero的质量中心。
尝试禁用“IDE集成”复选框(它位于IDE的“EurekaLog”/“EurekaLog IDE选项”菜单中)并运行您的应用程序 - 查看是否会改变行为。
我现在已向质量中心提交了一份报告:
http://qc.embarcadero.com/wc/qcmain.aspx?d=81881
希望通过这些信息,Embarcadero将能够在未来的版本中防止这种情况发生。
4年后,我回到这个问题,并意识到几个月前,我找到了解决方案,因此我将它发布给其他任何可能遇到此问题的人。
这个问题和解决方案在Olaf Monien博客2009/07/22发布的题为Delphi 2009 / Windows 7/64位调试器崩溃解决方案的文章中提供。
奥拉夫关于这篇文章的指示对我来说非常合适,问题也没有了。 我在他的博客文章评论中感谢他。
正如@rossmcm在他的评论中指出的,Olaf的博客帖子已不存在,但帖子仍可在Internet Archive上找到。 相反,请查看克里斯米勒关于问题的信息,其中包括现在在英巴卡迪诺拥有永久住所的补丁工具的链接。
这显然是在Delphi评估器(它是编译器的一部分)中发生的事情。 奇怪的是,如果事实上是经过writeobj.c,那肯定是不对的。 如果您可以通过测试案例重现此情况,请在QualityCentral(http://qc.embarcadero.com)上报告。
EEFFACE是C ++使用的SEH异常代码,它将一些Delphi代码(本例中是IDE本身)“泄漏”出来。 当异常代码不是Delphi生成的异常或与硬件相关的异常时,Delphi只会将其映射到EExternalException。
这不是一个确切的答案,但可以通过描述我的经验来帮助你克服错误。
当我转到Windows Vista和7时,我经常收到此错误。相同的代码在Windows XP上从未收到过该错误消息。 我可以在dpr文件的第一行放置一个断点,并发现它总是在为我的应用程序创建启动画面时发生。 我尝试了各种其他方式来做闪屏,但最终导致调试时出现EEFFACE错误。
所以为了解决这个问题,我现在说
if DebugHook = 0 then
当我创建并访问启动画面时。 当我正在调试时,我的应用程序的启动画面现在不显示,但至少我没有再看到EEFFACE错误。
看起来“外部异常”不是德尔福的错误,我之前有过这种例外,这可能是主板或硬件的问题,因为该程序在其他机器上运行良好。
链接地址: http://www.djcxy.com/p/16167.html