2010-02-04 13 views
19

Durante il debug la mia applicazione con Delphi 2009, a volte mi ottenere la seguente eccezione che si verificano:EEFFACE Eccezione esterno in Delphi

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

Questo accade solo occasionalmente, ma dopo aver premuto OK, allora la mia IDE e programma di entrambi possono congelare. Se sono fortunato posso a volte fare un File/SaveAll in Delphi, ma a volte non posso. In entrambi i casi sono bloccato e quindi l'unica cosa che posso fare è usare Windows Task Manager per spegnere Delphi. Ovviamente, se non potessi salvare SaveAll, allora perderò tutte le modifiche apportate dall'ultimo salvataggio.

Ho tutti gli aggiornamenti di Delphi 2009 installati fino all'aggiornamento 4. Incluso anche l'IDE Fix Pack 2009 2.9 installato.

L'errore è intrappolato per me da EurekaLog, e il rapporto di errore ha pronunciato la seguente stack di chiamate:

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

Come si può vedere, tutte dello stack di chiamate è in Delphi e Windows. Non si connette affatto a nessuna riga del mio programma.

Ho visto la pagina web: External Exception EEFFACE e la ho tradotta dal tedesco all'inglese, ma sembra che parli di Delphi C++ mentre non uso affatto il C++.

Il mio problema è che non ho idea di cosa potrebbe causare questo come non accade in modo coerente. Non ho idea nemmeno dove cercare di trovarlo o come rintracciarlo.

Qualcuno sa cosa sia e come posso rintracciarlo o almeno impedire che accada?


Alex di EurekaLog postato in risposta a my query on their forum:

penso che potrebbe essere un bug nel debugger di Delphi. Possibilmente correlato a tool di valutazione di valutazione oa qualcosa di simile .

Guardate voi stessi - abbiamo un'eccezione C++ nel modulo di sistema (EEFFACE è un codice speciale per eccezione VCL Quando VCL rileva un'eccezione C++ sconosciuto -. Si avvolge in oggetto EExternalException con il codice = EEFFACE) e stack di chiamate include unità di Delphi debugger:

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

Penso che si dovrebbe pubblicare questo descrizione della qualità di Embarcadero centrale.

tenta di disattivare "integrazione IDE" check-box (si trova in/ menù di IDE "EurekaLog" "Opzioni EurekaLog IDE") ed eseguire l'applicazione - vedere se ci sarà un cambiamento nel comportamento.


ho presentato ora una relazione al Quality Central a:

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

Speriamo che con queste informazioni, Embarcadero sarà in grado di prevenire questo nelle versioni future.


torno a questa domanda più di 4 anni più tardi, e si rendono conto che un paio di mesi fa, ho trovato la soluzione, così mi distacco qui per chiunque altro che possono incontrare questo.

Il problema e la soluzione sono stati forniti nel blog di Olaf Monien, in un post dal 2009/07/22 intitolato Delphi 2009/Windows 7/64 bit Debugger Crash Workaround.

Le istruzioni di Olaf su quel post funzionavano perfettamente per me, e il problema non c'è più. L'ho ringraziato in un commento sul suo post sul blog.

Come sottolinea @rossmcm nel suo commento, il post del blog di Olaf non è più lì, ma the post can still be found on the Internet Archive. Invece, controlla Chris Miller's information about the problem che include un collegamento a the patch tool that now has a permanent home at Embarcadero.

+2

È può installare le DDevExtensions di Andreas Hausladen. Ha un'opzione per il backup dei file dopo una compilazione riuscita. Ovviamente non risolverà questo errore, ma almeno non perdi i tuoi dati. –

+3

FWIW, il mio articolo è disponibile in lingua inglese così: http://www.audacia-software.de/en/bcb/external-exception-eefface.htm Si potrebbe avere scoperto che semplicemente cliccando la piccola bandiera del Regno Unito a sinistra :) –

+0

@Moritz: Grazie per il link inglese. Non so come mi sia mancata la tua piccola bandiera. Ma hai qualche idea su cosa potrebbe accadere per me? – lkessler

risposta

9

Questo è chiaramente qualcosa che accade nel valutatore Delphi (che fa parte del compilatore). La cosa strana è che se è, infatti, passando per writeobj.c, qualcosa non è certamente giusto. Se è possibile riprodurre questo con un caso di test, si prega di segnalarlo in QualityCentral (http://qc.embarcadero.com).

EEFFACE è il codice di eccezione SEH utilizzato da C++, che "perde" in qualche codice Delphi (in questo caso l'IDE stesso). Quando il codice di eccezione non è un'eccezione generata da Delphi o un'eccezione relativa all'hardware, Delphi semplicemente lo associa a EExternalException.

+0

"Quando il codice di eccezione non è un'eccezione generata da Delphi o un'eccezione relativa all'hardware, Delphi semplicemente lo associa a EExternalException." - L'IDE non può essere reso consapevole delle eccezioni C++? :) –

+0

Questo è più un problema per il runtime di Delphi, e sì, potremmo rendere Delphi più consapevole del fatto che EEFFACE è un'eccezione C++. Il problema è interpretare il carico utile in modo ragionevole. La cosa più semplice sarebbe semplicemente mappare a un altro tipo di eccezione come ECPPBuilderException. –

+3

On "interpretare il payload": qualche tempo fa ho scritto una classe wrapper Delphi che imita alcune funzioni dalla RTL C++ e li usa per estrarre il nome del tipo di eccezione e, nel caso di uno std :: eccezione, l'eccezione messaggio restituito da std :: exception :: what(). Fornisce inoltre l'accesso all'oggetto di eccezione C++ effettivo in modo che il codice C++ Builder possa eseguire l'invio di eccezioni dinamiche, ad esempio, in un gestore TApplicationEvents :: OnException. Potete trovare il mio involucro a http://www.audacia-software.de/en/win/bcb/sc.htm#SystemCppException. –

3

Questa non è una risposta esatta ma può aiutare a superare l'errore descrivendo la mia esperienza con esso.

Ho ricevuto questo errore regolarmente quando sono andato a Windows Vista e 7. Lo stesso codice non ha mai ricevuto quel messaggio di errore su Windows XP. Potrei mettere un punto di interruzione sulla prima riga del file dpr e ho scoperto che sembra sempre che si verifichi durante la creazione della schermata iniziale delle mie applicazioni. Ho provato vari altri modi per fare gli splash screen, ma alla fine hanno sempre provocato un errore EEFFACE durante il debug.

Quindi, per superare questo problema, ora mi metto

if DebugHook = 0 then 

quando creo e accedere alla schermata iniziale. La schermata iniziale delle mie applicazioni non appare ora quando eseguo il debug, ma almeno non ottengo più quell'errore di EEFFACE.

+0

Molto interessante, Peter. Sfortunatamente, nel mio programma, non ho una schermata iniziale, quindi non è l'unica causa. – lkessler

+0

Ho notato che altre persone come James (sopra) ottengono quando automatizza Office così sembra che ci siano una moltitudine di cause. La mia risposta è stata più di trasmettere la mia esperienza con esso nella speranza che potesse scatenare una soluzione da qualche parte lungo la pista. Credo che il problema esistesse ancora in XE (non sono sicuro di XE2). –

+0

Apprezzo il tuo contributo qui. Ma in realtà se vai a dare un'occhiata al rapporto di Quality Central che ho presentato un anno e mezzo fa (il link è nella mia domanda), vedrai che ci sono state molte attività e commenti su questo bug. Ma a partire da Delphi XE, non avevano ancora una soluzione. Quindi, se contribuisci con EEFFACE alla tua esperienza, potrebbe aiutarli. – lkessler

1

Sembra che "Eccezione esterna" non sia un bug di Delphi, ho avuto questa eccezione tempo fa e probabilmente era un problema con la scheda madre o con l'hardware, perché il programma funzionava bene su un'altra macchina.

+0

Grazie gadriano. Probabilmente non è un problema, per esempio, con la scheda madre, dal momento che funziona diversamente. Ma ho una scheda madre AMD, e forse è qualcosa di diverso da una scheda Intel. Non ho mai pensato a questa possibilità, e spiegherebbe perché non tutti lo provano. – lkessler

0

Recentemente mi sono imbattuto in questo ed è in qualche modo correlato all'IDE di Delphi.Il codice seguente finisce in questa eccezione sulla linea ShellExecute:

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

Ma non è questo:

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

Ma se eseguo la mia applicazione al di fuori di IDE è tutto a posto, senza la linea supplementare ShowMessage. Non so se sia d'aiuto, ma forse in altri casi in cui è necessario il debug, forse questo "trucco" potrebbe aiutare.

Sistema: DELL Optiplex, Intel Core2Duo, Win7 x64, Delphi 7

0

mi è stato alle prese con EEFFACE per settimane. Infine ha scoperto che la causa era questa istruzione:

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

il contenuto delle variabili pdffile e pdfcreatorfile erano lo stesso ....

Forse questo può aiutare alcuni poveraccio come me ...