Подтвердить что ты не робот

Внешнее исключение EEFFACE в Delphi

При отладке моего приложения в Delphi 2009 иногда возникает следующее исключение:

What is this?
(источник: beholdgenealogy.com)

Это происходит только изредка, но после нажатия OK моя IDE и программа могут зависнуть. Если мне повезет, я иногда могу сделать File/SaveAll в Delphi, но иногда я не могу. В любом случае, я застрял, и тогда единственное, что я могу сделать, это использовать диспетчер задач Windows, чтобы завершить работу Delphi. Конечно, если я не смог сохранить все, то я потеряю все изменения, сделанные после последнего сохранения.

У меня установлены все обновления Delphi 2009 вплоть до обновления 4. У меня также установлен IDE Fix Pack 2009 2.9.

Ошибка перехвачена для меня EurekaLog, и отчет об ошибке дает следующий стек вызовов:

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

Как видите, весь стек вызовов находится в Delphi и Windows. Он вообще не подключается к какой-либо линии в моей программе.

Я посмотрел на веб-страницу: Внешнее исключение EEFFACE и перевел ее с немецкого на английский, но, похоже, речь идет о Delphi C++, тогда как я вообще не использую C++.

Моя проблема в том, что я понятия не имею, что может быть причиной этого, поскольку это не происходит последовательно. Я понятия не имею, даже где искать это или как отследить это.

Кто-нибудь знает, что это такое и как я могу отследить или хотя бы предотвратить это?


Алекс из EurekaLog разместил это в ответ на мой запрос на их форуме:

Я думаю, что это может быть ошибка в отладчике Delphi. Возможно связано с оценочными подсказками или чем-то подобным.

Убедитесь сами - у нас есть исключение C++ в системном модуле (EEFFACE - это специальный код для исключения VCL. Когда VCL встречает неизвестное исключение C++ - он оборачивает его в объект EExternalException с code = EEFFACE), и стек вызовов включает 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] |  

Я думаю, что вы должны опубликовать это описание в Embarcadero Quality Central.

Попробуйте отключить флажок "Интеграция с IDE" (он находится в меню IDE "EurekaLog"/"Опции EurekaLog IDE") и запустить приложение - посмотрите, будет ли изменение в поведении.


Я отправил отчет в Quality Central по адресу:

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

Надеемся, что благодаря этой информации Embarcadero сможет предотвратить это в будущих выпусках.


Я возвращаюсь к этому вопросу более 4 лет спустя и понимаю, что несколько месяцев назад я нашел решение, поэтому я публикую его здесь для всех, кто может столкнуться с этим.

Проблема и решение были представлены в блоге Олафа Моньена в сообщении от 2009/07/22, озаглавленном Delphi 2009/Windows 7/64-битный обходной путь отладчика.

Инструкции Олафа к этому посту отлично сработали, и проблема исчезла. Я поблагодарил его в комментарии к его сообщению в блоге.

Как отмечает @rossmcm в своем комментарии, сообщения в блоге Олафа больше нет, но его все еще можно найти в интернет-архиве. Вместо этого, ознакомьтесь с информацией о проблеме Криса Миллера, которая включает ссылку на инструмент исправления, который теперь находится в Embarcadero.

4b9b3361

Ответ 1

Это явно что-то происходит в оценщике Delphi (который является частью компилятора). Странно то, что если это, собственно, и происходит через writeobj.c, то, конечно, не совсем правильно. Если вы можете воспроизвести это с помощью тестового примера, сообщите об этом в QualityCentral (http://qc.embarcadero.com).

EEFFACE - это код исключения SEH, используемый С++, который "протекает" на какой-то код Delphi (в данном случае сам IDE). Когда код исключения не является генерируемым Delphi исключением или связанным с оборудованием исключением, Delphi просто сопоставляет его с EExternalException.

Ответ 2

Это не точный ответ, но может помочь вам преодолеть ошибку, описав мой опыт работы с ней.

Я регулярно получал эту ошибку, когда перешел на Windows Vista и 7. Тот же код никогда не получал это сообщение об ошибке в Windows XP. Я мог бы поставить точку прерывания в первой строке файла dpr и обнаружил, что это всегда происходило при создании экрана заставки для моих приложений. Я пробовал другие способы создания всплывающих окон, но они всегда приводили к ошибке EEFFACE при отладке.

Чтобы преодолеть эту проблему, я теперь поставлю

if DebugHook = 0 then

когда я создаю и получаю доступ к экрану заставки. Экран заставки для моих приложений теперь не отображается, когда я отлаживаю, но по крайней мере я больше не получаю эту ошибку EEFFACE.

Ответ 3

Похоже, что "Внешнее исключение" не является ошибкой Delphi, у меня было это исключение раз назад, и это, вероятно, было проблемой с материнской платой или аппаратным обеспечением, потому что программа хорошо работала на другой машине.

Ответ 4

Недавно я столкнулся с этим, и он каким-то образом связан с Delphi IDE. Следующий код заканчивается в этом исключении в строке ShellExecute:

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

Но это не так:

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

Но если я запустил приложение вне IDE, все будет нормально без дополнительной строки ShowMessage. Я не знаю, помогает ли это, но, возможно, в других случаях, когда требуется отладка, возможно, этот "трюк" может помочь.

Система: DELL Optiplex, Intel Core2Duo, Win7 x64, Delphi 7

Ответ 5

Я боролся с EEFFACE неделями. Наконец выяснилось, что причиной была эта инструкция:

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

содержимое переменных pdffile и pdfcreatorfile было одинаковым....

Может быть, это может помочь бедному педерасту, как я...