External Exception EEFFACE in Delphi

While debugging my application with Delphi 2009, I sometimes get the following exception occurring:

What is this? http://www.beholdgenealogy.com/img/ideexception.gif

This only happens occasionally, but after pressing OK, then my IDE and program both may freeze. If I am lucky I can sometimes do a File/SaveAll in Delphi, but sometimes I can't. Either way I am stuck and then the only thing I can do is use Windows Task Manager to shut down Delphi. Of course, if I was unable to SaveAll, then I lose all the edits I had made since last saving.

I have all the Delphi 2009 Updates installed right up to and including Update 4. I also have IDE Fix Pack 2009 2.9 installed.

The Error is trapped for me by EurekaLog, and the error report gives the following call stack:

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       |         |
-----------------------------------------------------------------------------------------------------------

As you can see, all of the call stack is in Delphi and Windows. It does not connect back at all to any line in my program.

I have looked at the webpage: External Exception EEFFACE and translated it from German to English, but it appears to be talking about Delphi C++ whereas I don't use C++ at all.

My problem is I have no idea what might be causing this as it does not happen consistently. I have no idea even where to look to find it or how to track it down.

Does someone know what this is and how I can track it down or at least prevent it from happening?


Alex of EurekaLog posted this in response to my query on their forum:

I think it may be a bug in Delphi's debugger. Possibly related to evaluation tooltips or something similar.

See for yourself - we have an C++ exception in system module (EEFFACE is a special code for VCL exception. When VCL encounters an unknown C++ exception - it wraps it into EExternalException object with code = EEFFACE) and call stack includes Delphi debugger's units:

|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] |  

I think that you should post this description to Embarcadero's Quality Central.

Try to disable "IDE integration" check-box (it's located in IDE's "EurekaLog"/"EurekaLog IDE Options" menu) and run your application - see if there will be a change in behavior.


I have now submitted a report to Quality Central at:

http://qc.embarcadero.com/wc/qcmain.aspx?d=81881

Hopefully with this information, Embarcadero will be able to prevent this in future releases.


I come back to this question over 4 years later, and realize that a few months ago, I found the solution, so I am posting it here for anyone else who may encounter this.

The problem and solution were provided in Olaf Monien's blog, in a post from 2009/07/22 titled Delphi 2009 / Windows 7 / 64 bit Debugger Crash Workaround.

Olaf's instructions on that post worked perfectly for me, and the problem is gone. I thanked him in a comment on his blog post.

As @rossmcm points out in his comment, Olaf's blog post is no longer there, but the post can still be found on the Internet Archive. Instead, check out Chris Miller's information about the problem which includes a link to the patch tool that now has a permanent home at Embarcadero.


This is clearly something happening in the Delphi evaluator (which is part of the compiler). The odd thing is that if it is, in fact, going through writeobj.c, something is certainly not quite right. If you can reproduce this with a test case, please report it in QualityCentral (http://qc.embarcadero.com).

EEFFACE is the SEH exception code used by C++, which is "leaking" out to some Delphi code (in this case the IDE itself). When the exception code is not a Delphi generated exception or a hardware related exception, Delphi simply maps it to EExternalException.


This is not an exact answer but may help you with overcoming the error by describing my experience with it.

I received this error regularly when I went to Windows Vista and 7. The same code never received that error message on Windows XP. I could put a break point on the first line of the dpr file and found that it always seemed to occur when creating the splash screen to my applications. I tried various other ways to do splash screens but they always eventually resulted in getting an EEFFACE error when debugging.

So to overcome this issue, I now put

if DebugHook = 0 then

when I create and access the splash screen. The splash screen to my applications do not appear now when I'm debugging but at least I don't get that EEFFACE error anymore.


看起来“外部异常”不是德尔福的错误,我之前有过这种例外,这可能是主板或硬件的问题,因为该程序在其他机器上运行良好。

链接地址: http://www.djcxy.com/p/16168.html

上一篇: 有没有一种简单的方法来解决Delphi utf8的问题

下一篇: Delphi中的外部异常EEFFACE