External Exception EEFFACE in Delphi
Asked Answered
Z

5

23

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

What is this?
(source: beholdgenealogy.com)

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 (now also only available on the Internet Archive) which includes a link to the patch tool that now has a permanent home at Embarcadero.

Zoomorphism answered 4/2, 2010 at 4:41 Comment(6)
You can install Andreas Hausladen's DDevExtensions. It has an option to backup your files after a succesfull compile. It won't fix this error of course, but at least you don't loose your data.Diazotize
FWIW, my article is available in English language as well: audacia-software.de/en/bcb/external-exception-eefface.htm You could have found that by just clicking the little UK flag on the left :)Shul
@Moritz: Thanks for the English link. Don't know how I missed your little flag. But do you have any ideas what might be happening for me?Zoomorphism
Some code in the debugger (which is mostly written in C++) raises a C++ exception. I can't say what exactly is happening, of course, but you could use my SystemCppException unit, stuff it into an expert (or a package, but that's not quite as safe) and install that into the IDE, then the VCL will be able to extract a reasonable error message from C++ exceptions.Shul
(However Allen says it's rather the evaluator/compiler than the debugger. Guess he's right.)Shul
The link to Olaf's workaround is dead. The site is still active, though it redirects to another domain, but there is no sign of the post. However Olaf provided this link which references the fix, now hosted at embarcadero here.Revocation
L
10

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.

Lynching answered 4/2, 2010 at 5:46 Comment(4)
"When the exception code is not a Delphi generated exception or a hardware related exception, Delphi simply maps it to EExternalException." - Couldn't the IDE be made aware of C++ exceptions? :)Shul
This is more a matter for the Delphi runtime, and yes, we could make Delphi more aware of the fact that EEFFACE is a C++ exception. The problem is interpreting the payload in a reasonable way. The simplest thing would be to merely map to another exception type like ECPPBuilderException.Lynching
On "interpreting the payload": some time ago I wrote such a Delphi wrapper class that mimics a few functions from the C++ RTL and uses them to extract the exception type name and, in the case of a std::exception, the exception message returned by std::exception::what(). It also provides access to the actual C++ exception object so that C++Builder code may perform dynamic exception dispatching in, say, an TApplicationEvents::OnException handler. You can find my wrapper at audacia-software.de/en/win/bcb/sc.htm#SystemCppException .Shul
I keep getting the "External exception EEFFACE" error when I am automating MS office applications in Delphi 2010. I will eventually get the Abort/Try Again options and if I Abort the debugging options are disabled. The only way I can get back to normal is to restart the IDE. I am specifically using the GetActiveOleObject/CreateOleObject methods, it is definitely being thrown by using either/or.Prismatoid
B
3

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.

Bowls answered 31/10, 2011 at 3:28 Comment(4)
Very interesting, Peter. Unfortunately, in my program, I don't have a splash screen, so that's not the only cause.Zoomorphism
I've noticed other people like James (above) get it when he automates Office so it looks like there are a multitude of causes. My answer was more to relay my experience with it in the hope it might spark a solution somewhere down the track. I believe the issue still existed in XE (not sure about XE2).Bowls
I appreciate your input here. But actually if you go and look at the Quality Central report I submitted a year and a half ago (the link to it is in my question), you'll see there has been a lot of activity and comments re this bug. But as of Delphi XE, they still didn't have a solution. So if you contribute your experience with EEFFACE to that case, it might help them.Zoomorphism
This worked in my case. When Splash screen showed while debugging => EEFFACE. Now used the DebugHook to bypass => no more EEFFACE.Leporide
N
1

It seems that "External exception" isn't a Delphi's bug, I had this exception times ago and it was probably a problem with the motherboard, or with the hardware, because the program worked well at other machine.

Nika answered 27/7, 2012 at 18:10 Comment(1)
Thanks gadriano. Probably not a problem, per say, with the motherboard, since it works fine otherwise. But I have an AMD motherboard, and maybe it's something done differently from an Intel board. Never thought of that possibility, and it would explain why not everyone experiences it.Zoomorphism
M
0

Recently I've run into this and it's somehow related to the Delphi IDE. The following code ends up in this exception on the ShellExecute line:

url:='https://translate.google.com/#hu/en/%C3%A1';
ShellExecute(0,PChar('open'),PChar(url),nil,nil,SW_SHOWNORMAL);

But this is not:

url:='https://translate.google.com/#hu/en/%C3%A1';
ShowMessage(url);    
ShellExecute(0,PChar('open'),PChar(url),nil,nil,SW_SHOWNORMAL);

But if I run my app outside of IDE everything is fine without the ShowMessage extra line. I don't know if it helps, but maybe in other cases where debugging is needed maybe this "trick" could help.

System: DELL Optiplex, intel Core2Duo, Win7 x64, Delphi 7

Monarda answered 16/2, 2017 at 15:43 Comment(0)
D
0

I've been struggling with EEFFACE for weeks. Finally found that the cause was this instruction:

PDFForgePDF.CopyPDFFile(pdffile,pdfcreatorfile,1,1);

the contents of variables pdffile and pdfcreatorfile were the same....

Maybe this can help some poor bugger like myself...

Dichromate answered 15/3, 2017 at 15:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.