2010-02-04 17 views
19

Lors du débogage mon application avec Delphi 2009, je reçois parfois l'exception suivante se produit:Exception externe EEFFACE dans Delphi

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

Cela ne se produit que de temps en temps, mais après avoir appuyé sur OK, puis mon IDE et un programme à la fois peut gel. Si j'ai de la chance je peux parfois faire un fichier/SaveAll dans Delphi, mais parfois je ne peux pas. De toute façon je suis bloqué et puis la seule chose que je peux faire est d'utiliser le Gestionnaire des tâches de Windows pour fermer Delphi. Bien sûr, si je ne pouvais pas enregistrer, alors je perdais toutes les modifications que j'avais faites depuis la dernière sauvegarde.

Toutes les mises à jour de Delphi 2009 sont installées jusqu'à la mise à jour 4 incluse. J'ai également installé IDE Fix Pack 2009 2.9.

L'erreur me est pris au piège par EurekaLog, et le rapport d'erreur donne la pile d'appel suivant:

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

Comme vous pouvez le voir, tous de la pile d'appels est en Delphi et Windows. Il ne se connecte pas du tout à une ligne de mon programme.

J'ai regardé la page Web: External Exception EEFFACE et l'ai traduit de l'allemand vers l'anglais, mais il semble parler de Delphi C++ alors que je n'utilise pas C++ du tout.

Mon problème est que je n'ai aucune idée de ce qui pourrait être à l'origine de ce problème, car cela n'arrive pas systématiquement. Je n'ai aucune idée même où chercher pour le trouver ou comment le traquer.

Est-ce que quelqu'un sait ce que c'est et comment je peux le traquer ou au moins l'empêcher de se produire?


Alex de EurekaLog a publié ce billet en réponse à my query on their forum:

Je pense qu'il peut être un bogue dans le débogueur de Delphi . Peut-être lié à info-bulles d'évaluation ou quelque chose de similaire .

Voyez vous-même - nous avons un module exception du système C++ (EEFFACE est un code spécial pour exception VCL Lorsque VCL rencontre une inconnue exception C++ -. Il encapsule dans objet EExternalException avec le code = EEFFACE) et la pile d'appels comprend les unités de débogueur 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] | 

Je pense que vous devez envoyer ce description de la qualité d'Embarcadero Central.

Essayez de désactiver « l'intégration IDE » case (il est situé dans « EurekaLog » de l'EDI/« Options EurekaLog IDE menu » ) et exécutez votre application - voir s'il y aura un changement de comportement.


J'ai maintenant soumis un rapport au Centre Qualité:

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

Espérons que cette information, Embarcadero sera en mesure d'empêcher cela dans les versions ultérieures.


Je reviens à cette question plus de 4 ans plus tard, et se rendre compte qu'il ya quelques mois, j'ai trouvé la solution, donc je suis annonce ici pour quelqu'un d'autre qui peut rencontrer ce.

Le problème et la solution ont été fournis dans le blog de Olaf Monien, dans un article du 22/07/2009 intitulé Delphi 2009/Windows 7/64 bit Debugger Crash Workaround.

Les instructions d'Olaf sur ce poste ont parfaitement fonctionné pour moi, et le problème est parti. Je l'ai remercié dans un commentaire sur son blog. Comme @rossmcm le fait remarquer dans son commentaire, le blog d'Olaf n'est plus là, mais the post can still be found on the Internet Archive. Au lieu de cela, consultez Chris Miller's information about the problem qui comprend un lien vers the patch tool that now has a permanent home at Embarcadero.

+2

Vous peut installer DDevExtensions de Andreas Hausladen. Il a une option pour sauvegarder vos fichiers après une compilation réussie. Il ne va pas corriger cette erreur bien sûr, mais au moins vous ne perdez pas vos données. –

+3

FWIW, mon article est également disponible en anglais: http://www.audacia-software.de/en/bcb/external-exception-eefface.htm Vous auriez pu trouver cela en cliquant simplement sur le petit drapeau britannique à gauche :) –

+0

@Moritz: Merci pour le lien en anglais. Je ne sais pas comment j'ai raté ton petit drapeau. Mais avez-vous des idées sur ce qui pourrait m'arriver? – lkessler

Répondre

9

C'est clairement quelque chose qui se passe dans l'évaluateur Delphi (qui fait partie du compilateur). La chose étrange est que si elle passe, en fait, par writeobj.c, quelque chose n'est certainement pas correct. Si vous pouvez reproduire ceci avec un cas de test, veuillez le signaler dans QualityCentral (http://qc.embarcadero.com). EEFFACE est le code d'exception SEH utilisé par C++, qui "fuit" vers du code Delphi (dans ce cas, l'EDI lui-même). Lorsque le code d'exception n'est pas une exception générée par Delphi ou une exception liée au matériel, Delphi la mappe simplement à EExternalException.

+0

"Lorsque le code d'exception n'est pas une exception générée par Delphi ou une exception liée au matériel, Delphi l'associe simplement à EExternalException." - L'IDE ne peut-il être mis au courant des exceptions C++? :) –

+0

Ceci est plus une question pour l'exécution de Delphi, et oui, nous pourrions rendre Delphi plus conscient du fait que EEFFACE est une exception C++. Le problème est d'interpréter la charge utile d'une manière raisonnable. La chose la plus simple serait de simplement mapper à un autre type d'exception comme ECPPBuilderException. –

+3

Sur "interpréter la charge": il y a quelque temps j'ai écrit une classe wrapper Delphi qui imite quelques fonctions du RTL C++ et les utilise pour extraire le nom du type d'exception et, dans le cas d'une exception std :: exception, l'exception message renvoyé par std :: exception :: what(). Il fournit également un accès à l'objet d'exception C++ réel de sorte que le code C++ Builder puisse effectuer une répartition d'exception dynamique dans, disons, un gestionnaire TApplicationEvents :: OnException. Vous pouvez trouver mon emballage à http://www.audacia-software.de/en/win/bcb/sc.htm#SystemCppException. –

3

Ce n'est pas une réponse exacte, mais peut vous aider à surmonter l'erreur en décrivant mon expérience avec elle.

J'ai reçu cette erreur régulièrement lorsque je suis allé à Windows Vista et 7. Le même code n'a jamais reçu ce message d'erreur sur Windows XP. Je pourrais mettre un point d'arrêt sur la première ligne du fichier dpr et trouver qu'il semblait toujours se produire lors de la création de l'écran de démarrage de mes applications. J'ai essayé plusieurs autres façons de faire des écrans de démarrage, mais ils ont toujours abouti à une erreur EEFFACE lors du débogage.

Donc, pour remédier à ce problème, je vais maintenant mettre

if DebugHook = 0 then 

lorsque je crée et accéder à l'écran de démarrage. L'écran de démarrage de mes applications n'apparaît pas maintenant lorsque je débogue mais au moins je n'ai plus cette erreur EEFFACE.

+0

Très intéressant, Peter. Malheureusement, dans mon programme, je n'ai pas d'écran d'accueil, donc ce n'est pas la seule cause. – lkessler

+0

J'ai remarqué que d'autres personnes comme James (ci-dessus) l'ont quand il automatise Office, alors il semble qu'il y ait une multitude de causes. Ma réponse était plus pour relayer mon expérience avec elle dans l'espoir que cela pourrait déclencher une solution quelque part sur la piste. Je crois que le problème existait toujours dans XE (pas sûr de XE2). –

+0

J'apprécie votre contribution ici. Mais en fait, si vous regardez le rapport Quality Central que j'ai soumis il y a un an et demi (le lien est dans ma question), vous verrez qu'il y a eu beaucoup d'activité et de commentaires sur ce bug. Mais à partir de Delphi XE, ils n'avaient toujours pas de solution. Donc, si vous contribuez à cette expérience avec l'EEFFACE, cela pourrait les aider. – lkessler

1

Il semble que "exception externe" n'est pas un bug Delphi, j'ai eu cette exception il y a des fois et c'était probablement un problème avec la carte mère, ou avec le matériel, parce que le programme fonctionnait bien.

+0

Merci gadriano. Probablement pas un problème, par exemple, avec la carte mère, car cela fonctionne bien autrement. Mais j'ai une carte mère AMD, et peut-être que c'est quelque chose qui se fait différemment d'un tableau Intel. Je n'ai jamais pensé à cette possibilité, et cela expliquerait pourquoi tout le monde ne l'expérimente pas. – lkessler

0

Récemment, j'ai rencontré ce problème et il est en quelque sorte lié à l'IDE Delphi.Le code suivant se termine dans cette exception sur la ligne ShellExecute:

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

Mais ce n'est pas:

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

Mais si je lance mon application en dehors de l'IDE tout va bien sans ShowMessage ligne supplémentaire. Je ne sais pas si cela aide, mais peut-être que dans d'autres cas où le débogage est nécessaire peut-être que cette "astuce" pourrait aider.

Système: DELL Optiplex, Core2Duo Intel, Win7 x64, Delphi 7

0

J'ai été aux prises avec EEFFACE pendant des semaines. Enfin constaté que la cause était cette instruction:

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

le contenu des variables PDFfile et pdfcreatorfile étaient les mêmes ....

Peut-être que cela peut aider un pauvre bougre comme moi ...