Сейчас на форуме: jinoweb (+5 невидимых)

 eXeL@B —› Программирование —› Исключение 0x0eedfade - откуда ноги растут?
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 20 сентября 2009 18:13
· Личное сообщение · #1

Последнее время стал часто замечать, что мои некоторые проекты на Delphi вдруг начинают вызывать исключение 0x0eedfade. Проявляется это не всегда и не везде. То есть на стадии разработки работало, прошло время - не работает. Отлавливал ошибку путём выкидывания некоторых участков кода, выводил в лог места которые удавалось пройти до проблемного момента, отлаживал пошагово и много времени провёл в гугле. На основе своих изысканий сделал вывод, что от приложения к приложению места могут быть разные, то есть например я использую функцию подсчета контрольной суммы, код помещен не в библиотеку, а идёт в виде функции в теле проекта, это модуль, сделав один, я делаю ещё 3 копии и вношу изменения. Таким образом получаю 4 длл с частью похожего кода но с разным назначением, где в одной вдруг начинает слетать в недрах функции подсчёта CRC, в то время как в остальных трёх этот код работает без проблем... Стоит закомментировать вызов функции, как всё работает без ошибок... Я не готов выложить пример, а лишь пытаюсь докопаться до сути. Поиск в интернете показал, что это исключение появляется совершенно неожиданно во многих известных программах, можно дать в гугле 0x0eedfade и имя программы и скорее всего это исключение там появлялось...
На форумах по Delphi пытаются отловить проблемные места используя try except, кто-то переписывает проблемный код хотя в нём нет явных ошибок, на форуме по Sound Empire проблему решали отключением интегрированной звуковой карты и много разных вариантов решения предлагают в сети.
Единственное чего не удалось найти, так это внятного описания того из за чего и почему это появляется и как избежать подобного на стадии разработки. Ибо незнание и непонимание принципов возникновения этой проблемы не даёт гарантии, что отлично работающая и отлаженная программа будет работать на любом компьютере...
Ну правда, тем же винампом пользуется огромное кол-во народа и только один на форуме пишет, что у него возникло такое исключение...
Как быть? Прошу разбирающихся людей или встречавших подобную проблему просветить меня.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 20 сентября 2009 21:08
· Личное сообщение · #2

В системном логе ничего не пишет?

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 20 сентября 2009 21:22 · Поправил: daFix
· Личное сообщение · #3

ToBad
Если у тебя нет антивирусника, то может быть у тебя и вирус в дельфе сидит.
Тут BoRoV писал антивирусник под него, попробуй провериться

http://exelab.ru/f/action=vthread&topic=14896&forum=6&page =3#5

*************

BoRoV, просто нашёл первую ссылку и кинул))

-----
Research For Food





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 20 сентября 2009 21:35
· Личное сообщение · #4

daFix пишет:
Тут BoRoV писал антивирусник под него, попробуй проверитьсяhttp://exelab.ru/f/action=vthread&topic=14896&f orum=6&page =3#5

я бы дал сылку на это, а не англ перевод его, все таки на русском понятней
http://exelab.ru/f/action=vthread&topic=14896&forum=6&page =2#24

-----
Лучше быть одиноким, но свободным © $me




Ранг: 13.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 сентября 2009 21:38 · Поправил: Nowar
· Личное сообщение · #5

В статье http://www.progz.ru/articles.php?view=84 описана ошибка в процедуре _StartLib модуля system.pas
Данная ошибка присутствовала только в Delphi 6 до SP2.



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 20 сентября 2009 21:55
· Личное сообщение · #6

Проще всего удалить дельфи и поставить нормальный компилятор

-----
Shalom ebanats!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 20 сентября 2009 23:06
· Личное сообщение · #7

Во первых что за коды, откуда взят код исключения ?
Во вторых слишком много текста, всё читать взападло. Поконкретнее плиз. Какие шлюзы исключений юзаются и какой при вызове их стек ?




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 21 сентября 2009 01:05 · Поправил: ToBad
· Личное сообщение · #8

***del




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 21 сентября 2009 01:13
· Личное сообщение · #9

Hexxx пишет:
В системном логе ничего не пишет?


Пишет: Всплывающее окно приложения: test1.exe - Ошибка приложения : Исключение неизвестное программное исключение (0x0eedfade) в приложении по адресу 0x7c812a23.

daFix пишет:
Если у тебя нет антивирусника, то может быть у тебя и вирус в дельфе сидит.


С индюком была эпопея, но всё давно позади, антивирь теперь стоит.

Nowar пишет:
В статье описана ошибка в процедуре _StartLib модуля system.pas


Интересная статья. Почитал, проверил - у меня правильно всё в библиотеке. Delphi 7 установлена.


SLV пишет:
Проще всего удалить дельфи и поставить нормальный компилятор


Ну это извечный спор, что лучше, а что хуже. Дельфи для меня удобней, плюс наработок много. Изучать новый язык, а я так понимаю что под нормальным имелся ввиду Си - по времени сейчас не могу. А вообще вопрос собственно в том, что ошибка возникает там, где по идее её не должно быть. Хочется разобраться с причиной, а не перейти на другой компилятор или не использовать частное решение одной из ситуаций, как обычно поступали многие.

Clerk пишет:
Во первых что за коды, откуда взят код исключения ?


Из месседжбокса... Простая dll на дельфи, из мейна запускается трид обслуживающий сеть. Там и падает не пройдя создание таблицы crc, хотя этот же код неизменно работает в другом проекте. Если удалить эту функцию - падает не успевая создать трид. Если захожу в дельфовый отладчик, вижу что остановился на рете какого то трида, стек указывает куда то очень далеко... В принципе в журнале так и пишет..

p.s. Ставил Delphi 10, перекомпилировал - таже фигня.



Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 21 сентября 2009 01:18 · Поправил: uinor
· Личное сообщение · #10

Под отладчиком воспроизводимо? Почему не отдебажите то? Для начала дельфовым попробовать, авось ошибка то в коде.

Я на 7ке уже много лет - никогда такого не было, за исключением моих же косяков, конечно



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 сентября 2009 05:23
· Личное сообщение · #11

Проверьте на другом билде виндов. У меня пару раз бывало что на конкретном билде kernel32.dll приложение падает там, где падать не должно в принципе.



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 21 сентября 2009 06:12
· Личное сообщение · #12

induc?




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 21 сентября 2009 09:11 · Поправил: ARCHANGEL
· Личное сообщение · #13

SLV пишет:
Проще всего удалить дельфи и поставить нормальный компилятор
Ага, Вижал Бейсик.
Azur1d пишет:
Проверьте на другом билде виндов. У меня пару раз бывало что на конкретном билде kernel32.dll приложение падает там, где падать не должно в принципе.
Наверное, это была какая-то спец. сборка от дяди Васи в элитном подвале сборок?
ToBad
Вообще, я замечал, что Делфи не всегда корректно работает с передачей параметров в функции по своему дефолтовому соглашению о вызовах (типа fastcall). Попробуй заменить соглашение о вызовах для своих функций на stdcall.
Clerk пишет:
Какие шлюзы исключений юзаются и какой при вызове их стек ?
Вопрос, который меня озадачил. Шлюзы, это типа, нужно узнать, какой обработчик исключения в ядре срабатывает? Ну, это можно и по коду исключения сказать, или имеется ввиду, не перехвачены ли эти дефолтовые обработчики всякими Syser'ами? Какой стэк при вызове - это, типа, надо с ядра этот стэк забрать и привести здесь? Я предлагаю проще - Breakpoint on KiUserExceptionDispatcher, далее оределяем по параметрам адрес исключения, при следующем запуске ставим на этот адрес бряк, а когда он сработает, т.е. непосредственно перед исключением, делаем Call Stack, и узнаем, откуда ноги растут. Далее причину можно определить сравнением трасс этой сбойной, и нормальной из работающего проекта.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 21 сентября 2009 09:43
· Личное сообщение · #14

ToBad

У тебя запускает тред dll?
Так для размышления, может быть именно тут ошибка. Если в main dll запускается тред, то фактически он будет только создан но не запушен, а запустится только тогда, когда закончится инициализация этой библиотеки. Может быть ты в том же main после создания потока чтото делаешь с результатами полученными после выполнения потока (который естественно не выполняется и результатов нет)

И еще, где может быть ошибка, ты говоришь что dll что то мутит с сетью. Вот например функция InternetOpen или InternetConnect (не помню точно), при вызове подгружает еще какие то dll, к которых создаются дополнительные потоки, вот в этом случае, если ты вызываешь InternetOpen или InternetConnect а потом InternetReadFile из dll main, то последняя замораживается (т.к. созданные треды еще не выполняются) и возможно Delphi генерит такое исключение.



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 21 сентября 2009 09:55
· Личное сообщение · #15

ARCHANGEL пишет:
Наверное, это была какая-то спец. сборка от дяди Васи в элитном подвале сборок?

Нет. Это была Kernel32.dll версии 5.1.2600.5781 Ошибка по адресу 0x00012afb
Вот -->тут <-- еще много жалоб на конкретно эту ошибку в конкретно этом билде длл. Так что дядя Вася не при чем.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 21 сентября 2009 16:13
· Личное сообщение · #16

ARCHANGEL
> Breakpoint on KiUserExceptionDispatcher
Я уверен что это исключение намеренно сгенерировано посредством NtRaiseException, либо в боксе не верная информация отображается.



Ранг: 116.5 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 21 сентября 2009 16:40
· Личное сообщение · #17

В разделе для новичков эта тема уже подымалась в топе Исключения в Ollydbg и там был, правда, аспак, но это подтверждает догадки Clerk-а о том чо это искуственно созданное исключение.



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 21 сентября 2009 17:56
· Личное сообщение · #18

Исключение 0x0eedfade выбрасывается (в частности, в целях отладки) в функе System.@RaiseExcept (в самом модуле - _RaiseExcept) при возникновении различных чисто дельфовых ошибок, например, неправильные данные на входе StrToInt (см. функу SysUtils.ConvertError в отладчике), или ошибка при создании вариантного массива (функа Variants.VarArrayCreateError).
Если все нормально, то приложение (если не отладчик) обрабатывает их и выдает соответствующий месаджбокс, вроде ''1oo' is not a valid integer value' (строка из SysConst). Если никак не обрабатывается, то и вылетает сообщение "Исключение неизвестное программное исключение (0x0eedfade) в приложении по адресу..." (обычно по адресу возврата из RtlRaiseException). Такое может случиться если, например, вызвать это исключение вне какого-либо вцл класса (в разделе инициализации модуля или в консольном приложении).
Попробуй отследить при каких обстоятельствах вызывается @RaiseExcept, генерящий бажное 0x0eedfade, и устранить их (обстоятельства))), либо попробуй обрабатывать исключение.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 21 сентября 2009 18:45
· Личное сообщение · #19

Valemox
Это не догадки, а матчасть. NTSTATUS- коды формируются определённым образом(wrk, ntstatus.h):
Code:
  1. //   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  2. //   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  3. //  +---+-+-+-----------------------+-------------------------------+
  4. //  |Sev|C|R|     Facility          |               Code            |
  5. //  +---+-+-+-----------------------+-------------------------------+
  6. //
  7. //  where
  8. //
  9. //      Sev - is the severity code
  10. //
  11. //          00 - Success
  12. //          01 - Informational
  13. //          10 - Warning
  14. //          11 - Error
  15. //
  16. //      C - is the Customer code flag
  17. //
  18. //      R - is a reserved bit
  19. //
  20. //      Facility - is the facility code
  21. //
  22. //      Code - is the facility's status code
  23. //
  24. //
  25. // Define the facility codes
  26. //
  27. #define FACILITY_USB_ERROR_CODE          0x10
  28. #define FACILITY_TRANSACTION             0x19
  29. #define FACILITY_TERMINAL_SERVER         0xA
  30. #define FACILITY_SXS_ERROR_CODE          0x15
  31. #define FACILITY_RPC_STUBS               0x3
  32. #define FACILITY_RPC_RUNTIME             0x2
  33. #define FACILITY_IO_ERROR_CODE           0x4
  34. #define FACILITY_HID_ERROR_CODE          0x11
  35. #define FACILITY_FIREWIRE_ERROR_CODE     0x12
  36. #define FACILITY_DEBUGGER                0x1
  37. #define FACILITY_COMMONLOG_ERROR_CODE    0x1A
  38. #define FACILITY_CLUSTER_ERROR_CODE      0x13
  39. #define FACILITY_ACPI_ERROR_CODE         0x14
  40.  
  41.  
  42. //
  43. // Define the severity codes
  44. //
  45. #define STATUS_SEVERITY_WARNING          0x2
  46. #define STATUS_SEVERITY_SUCCESS          0x0
  47. #define STATUS_SEVERITY_INFORMATIONAL    0x1
  48. #define STATUS_SEVERITY_ERROR            0x3

Если разобрать значение 0x0eedfade(00001110 11101101 11111010 11011110B), то получается что это не ошибка(Sev. 00 - Success), устройство не системное и не известно(Fac. 0xE). Даже без этого сразу видно что это не системный код ошибки. Такой сепшен может быть сгенерирован только програмно посредством сервиса NtRaiseException.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 22 сентября 2009 02:42
· Личное сообщение · #20

Кажется я начал понимать причину этих ошибок... Ещё точно проверю завтра и обязательно отпишу, но создалось впечатление, что виной всему моё беспорядочное использование и взаимное присвоение типов longint и dword. И хотя то и то 4 байта, видимо разница всё же значимая...



Ранг: 18.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 22 сентября 2009 08:11
· Личное сообщение · #21

Clerk, это ж Access Violation по адресу. Зачем привлекать сюда столь низкий уровень? Просто народ не может нормально пояснить проблему.

Понятное дело что "кто-то" просто прокосячил. Что за попытка притянуть за уши какую-то мега-проблему? ToBad, ошибка у вас в коде.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 22 сентября 2009 11:07
· Личное сообщение · #22

uinor
> Access Violation
Это не страничное нарушение. Хотя возможно гдето в глубине этого мусора оно возникает, но дельфи не правильно нас об этом информирует. Короче я против дельфе, фтопку его, он притупляет, это гуан среда.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 сентября 2009 13:10
· Личное сообщение · #23

Clerk пишет:
Короче я против дельфе, фтопку его, он притупляет, это гуан среда.
Зато проги дельфоские без декомпиля сложнее (на порядок сложнее) ломать, т.к. одна функция может содержать пять call'ов, внутри каждого из которых ещё 5, а там ещё 3, а там ещё 7 и т.д. Так что разрабы от делфей никогда не откажутся + скорость разработки.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 22 сентября 2009 15:05
· Личное сообщение · #24

ARCHANGEL пишет:
Зато проги дельфоские без декомпиля сложнее (на порядок сложнее) ломать, т.к. одна функция может содержать пять call'ов, внутри каждого из которых ещё 5, а там ещё 3, а там ещё 7 и т.д. Так что разрабы от делфей никогда не откажутся + скорость разработки.


Ну да, скорость разработки зачастую очень важна... Что касается кучи call'ов и прочего мусора, то многое конечно зависит от того, кто пишет... Можно активно использовать ассемблерные вставки или обращаться напрямую к функциям ws2_32, а можно использовать Indy и косячить как я в этом топике.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 22 сентября 2009 16:49
· Личное сообщение · #25

ARCHANGEL
Если вам стопяцот холостых ветвлений нужно, то используйте криптор .



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 23 сентября 2009 11:15
· Личное сообщение · #26

Это искусственный эксепшн, т.к. произведен из feedfade - "хекс слов". Просто нужен был severity code = 0 и пришлось укоротить. Правда это мои домыслы




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 23 сентября 2009 12:45
· Личное сообщение · #27

tundra37 пишет:
Это искусственный эксепшн


Тогда лучше сделали бы: 0xdeaddead



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 23 сентября 2009 13:20
· Личное сообщение · #28

ToBad, отпишитесь потом о результатах, интересно все-таки.



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 23 сентября 2009 18:12
· Личное сообщение · #29

tundra37 пишет:
Это искусственный эксепшн

Да, см. пост #18

ToBad пишет:
Тогда лучше сделали бы: 0xdeaddead

Неполучица) - бит 28 зарезервирован (будет выброшено 0xceaddead)

ToBad, ну так что это за функция была с лонгинтом внутри? ))




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 23 сентября 2009 18:52
· Личное сообщение · #30

_ruzmaz_ Вот так выдавало ексепшн:

Code:
  1. Var i,m,j,tmp:longint;
  2.     crc_tab:array [0..255] of longint;
  3.  
  4. begin
  5. for i:=0 to 255 do begin
  6. tmp:=i;
  7. for m:=1 to 8 do begin
  8. j:=tmp;
  9. asm
  10. pushf
  11. push eax
  12. mov eax,tmp
  13. shr eax,1
  14. and eax,$7FFFFFFF
  15. mov tmp,eax
  16. pop eax
  17. popf
  18. end;
  19. if (and 1)=1 then tmp:=tmp xor $EDB88320;
  20. end;
  21. crc_tab[i]:=tmp;
  22. end;
  23. crc_tab[255]:=0;
  24. end.


вот так не стало:

Code:
  1. Var i,m,j,tmp:dword;
  2.     crc_tab:array [0..255] of dword;
  3.  
  4. begin
  5. for i:=0 to 255 do begin
  6. tmp:=i;
  7. for m:=1 to 8 do begin
  8. j:=tmp;
  9. asm
  10. pushf
  11. push eax
  12. mov eax,tmp
  13. shr eax,1
  14. and eax,$7FFFFFFF
  15. mov tmp,eax
  16. pop eax
  17. popf
  18. end;
  19. if (and 1)=1 then tmp:=tmp xor $EDB88320;
  20. end;
  21. crc_tab[i]:=tmp;
  22. end;
  23. crc_tab[255]:=0;
  24. end.


Почему именно так реализовано не помню, давно дело было... Но думаю не только тут проблема. Ексепшины ещё бывают, но уже не тут...


. 1 . 2 . >>
 eXeL@B —› Программирование —› Исключение 0x0eedfade - откуда ноги растут?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати