2010-02-04 9 views
19

Al depurar mi aplicación con Delphi 2009, a veces tengo la siguiente excepción que ocurre:EEFFACE Excepción externa en Delphi

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

Esto sólo ocurre de vez en cuando, pero después de pulsar Aceptar, entonces mi IDE y el programa ambos pueden congelar. Si tengo suerte, a veces puedo hacer un archivo/guardar todo en Delphi, pero a veces no puedo. De cualquier manera estoy atascado y luego, lo único que puedo hacer es usar el Administrador de tareas de Windows para apagar Delphi. Por supuesto, si no pude guardar todo, entonces perderé todas las ediciones que hice desde el último guardado.

Tengo todas las actualizaciones de Delphi 2009 instaladas hasta e incluyendo la Actualización 4. También tengo IDE Fix Pack 2009 2.9 instalado.

El error es atrapado por mí EurekaLog, y el informe de error da la siguiente pila de llamadas:

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

Como se puede ver, toda la pila de llamadas es en Delphi y Windows. No se conecta en absoluto a ninguna línea en mi programa.

He consultado la página web: External Exception EEFFACE y la he traducido del alemán al inglés, pero parece estar hablando de Delphi C++, mientras que no uso C++ en absoluto.

Mi problema es que no tengo idea de lo que podría estar causando esto, ya que no ocurre de manera coherente. No tengo ni idea de dónde buscar para encontrarlo o cómo rastrearlo.

¿Alguien sabe qué es esto y cómo puedo rastrearlo o al menos evitar que ocurra?


Alex de EurekaLog publicado esto en respuesta a my query on their forum:

Creo que puede ser un error en depurador de Delphi. Posiblemente relacionado con información sobre herramientas de evaluación o algo similar similar.

Vea usted mismo - tenemos una excepción C++ en el módulo del sistema (EEFFACE es un código especial para VCL excepción Cuando VCL se encuentra con un desconocido C++ excepción -. Que lo envuelve en objeto EExternalException con código = EEFFACE) y la pila de llamadas incluye unidades de Delphi depurador:

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

pienso que usted debe enviar este descripción a Embarcadero's Quality Central.

intenta deshabilitar la "integración IDE" casilla (se encuentra en/"Opciones EurekaLog IDE" menú "EurekaLog" del IDE ) y ejecutar la aplicación - ver si va a haber un cambio en el comportamiento.


me han presentado ahora un informe de calidad central en:

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

Esperemos que con esta información, Embarcadero será capaz de prevenir esto en futuras versiones.


vuelvo a esta pregunta más de 4 años más tarde, y se dan cuenta de que hace unos meses, he encontrado la solución, así que estoy publicando aquí para cualquier otra persona que pueda encontrarse presente.

El problema y la solución se proporcionaron en el blog Olaf Monien, en una publicación de 2009/07/22 titulada Delphi 2009/Windows 7/64 bit Debugger Crash Workaround.

Las instrucciones de Olaf en esa publicación funcionó perfectamente para mí, y el problema se ha ido. Le di las gracias en un comentario en su publicación de blog.

Como @rossmcm señala en su comentario, la publicación de blog de Olaf ya no está allí, pero the post can still be found on the Internet Archive. En su lugar, consulte Chris Miller's information about the problem que incluye un enlace al the patch tool that now has a permanent home at Embarcadero.

+2

Usted puede instalar DDevExtensions de Andreas Hausladen. Tiene la opción de hacer una copia de seguridad de tus archivos luego de una compilación exitosa. No solucionará este error, por supuesto, pero al menos no perderá sus datos. –

+3

FWIW, mi artículo está disponible también en inglés: http://www.audacia-software.de/en/bcb/external-exception-eefface.htm Lo podría haber encontrado haciendo clic en la pequeña bandera de UK a la izquierda :) –

+0

@Moritz: gracias por el enlace en inglés. No sé cómo extrañé tu pequeña bandera. ¿Pero tienes alguna idea de lo que podría estar pasando por mí? – lkessler

Respuesta

9

Esto claramente está sucediendo en el evaluador Delphi (que es parte del compilador). Lo curioso es que si, de hecho, está pasando por writeobj.c, algo no está del todo bien. Si puede reproducir esto con un caso de prueba, informe en QualityCentral (http://qc.embarcadero.com).

EEFFACE es el código de excepción SEH utilizado por C++, que se está "filtrando" a algún código Delphi (en este caso, el IDE mismo). Cuando el código de excepción no es una excepción generada por Delphi o una excepción relacionada con el hardware, Delphi simplemente lo asigna a EExternalException.

+0

"Cuando el código de excepción no es una excepción generada por Delphi o una excepción relacionada con el hardware, Delphi simplemente lo asigna a EExternalException". - ¿No podría el IDE conocer las excepciones de C++? :) –

+0

Esto es más una cuestión del tiempo de ejecución de Delphi, y sí, podríamos hacer que Delphi sea más consciente del hecho de que EEFFACE es una excepción de C++. El problema es interpretar la carga útil de una manera razonable. Lo más simple sería simplemente asignar a otro tipo de excepción como ECPPBuilderException. –

+3

Acerca de "interpretar la carga útil": hace algún tiempo escribí una clase de envoltura de Delphi que imita algunas funciones de C++ RTL y las usa para extraer el nombre del tipo de excepción y, en el caso de una excepción std ::, la excepción mensaje devuelto por std :: exception :: what(). También proporciona acceso al objeto de excepción de C++ real para que el código de C++ Builder pueda realizar el despacho dinámico de excepciones en, digamos, un controlador TApplicationEvents :: OnException. Puede encontrar mi envoltorio en http://www.audacia-software.de/en/win/bcb/sc.htm#SystemCppException. –

3

Esta no es una respuesta exacta, pero puede ayudarte a superar el error describiendo mi experiencia con ella.

Recibí este error regularmente cuando fui a Windows Vista y 7. El mismo código nunca recibió ese mensaje de error en Windows XP. Podría poner un punto de quiebre en la primera línea del archivo dpr y descubrí que siempre parecía ocurrir cuando creaba la pantalla de presentación para mis aplicaciones. Probé varias otras formas de hacer pantallas emergentes, pero siempre dieron como resultado un error de EEFFACE al depurar.

Así que para superar este problema, presento ahora

if DebugHook = 0 then 

cuando crear y acceder a la pantalla de bienvenida. La pantalla de inicio de mis aplicaciones no aparece ahora cuando estoy depurando, pero al menos ya no tengo ese error de EEFFACE.

+0

Muy interesante, Peter. Desafortunadamente, en mi programa, no tengo una pantalla de bienvenida, así que esa no es la única causa. – lkessler

+0

Me he dado cuenta de que otras personas como James (arriba) la obtienen cuando automatiza Office, por lo que parece que hay una multitud de causas. Mi respuesta fue más para transmitir mi experiencia con la misma con la esperanza de que pueda generar una solución en algún lugar de la pista. Creo que el problema aún existía en XE (no estoy seguro acerca de XE2). –

+0

Agradezco su opinión aquí. Pero en realidad si vas y miras el informe de Quality Central que envié hace un año y medio (el enlace está en mi pregunta), verás que ha habido mucha actividad y comentarios sobre este error. Pero a partir de Delphi XE, todavía no tenían una solución. Entonces, si usted contribuye con su experiencia con EEFFACE a ese caso, podría ayudarlos. – lkessler

1

Parece que "Excepción externa" no es un error de Delphi, tuve esta excepción hace mucho tiempo y probablemente fue un problema con la placa base o con el hardware, porque el programa funcionaba bien en otra máquina.

+0

Gracias gadriano. Probablemente no sea un problema, por ejemplo, con la placa base, ya que funciona bien de lo contrario. Pero tengo una placa madre AMD, y tal vez es algo diferente de una placa Intel. Nunca pensé en esa posibilidad, y eso explicaría por qué no todos lo experimentan. – lkessler

0

Recientemente me he encontrado con esto y de alguna manera está relacionado con el Delphi IDE.El siguiente código termina en esta excepción en la línea ShellExecute:

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

Pero esto no es:

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

Pero si me quedo mi aplicación fuera del IDE todo está bien sin la línea adicional ShowMessage. No sé si ayuda, pero tal vez en otros casos en los que se necesite eliminar errores, este "truco" podría ayudar.

sistema: Dell Optiplex, Intel Core2Duo, Win7 x64, Delphi 7

0

he estado luchando con EEFFACE durante semanas. Finalmente se encontró que la causa era esta instrucción:

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

el contenido de variables PDFfile y pdfcreatorfile eran los mismos ....

Tal vez esto puede ayudar a un pobre desgraciado como yo ...

Cuestiones relacionadas