Сейчас на форуме: jinoweb (+5 невидимых) |
eXeL@B —› Программирование —› Исключение 0x0eedfade - откуда ноги растут? |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 20 сентября 2009 18:13 · Личное сообщение · #1 Последнее время стал часто замечать, что мои некоторые проекты на Delphi вдруг начинают вызывать исключение 0x0eedfade. Проявляется это не всегда и не везде. То есть на стадии разработки работало, прошло время - не работает. Отлавливал ошибку путём выкидывания некоторых участков кода, выводил в лог места которые удавалось пройти до проблемного момента, отлаживал пошагово и много времени провёл в гугле. На основе своих изысканий сделал вывод, что от приложения к приложению места могут быть разные, то есть например я использую функцию подсчета контрольной суммы, код помещен не в библиотеку, а идёт в виде функции в теле проекта, это модуль, сделав один, я делаю ещё 3 копии и вношу изменения. Таким образом получаю 4 длл с частью похожего кода но с разным назначением, где в одной вдруг начинает слетать в недрах функции подсчёта CRC, в то время как в остальных трёх этот код работает без проблем... Стоит закомментировать вызов функции, как всё работает без ошибок... Я не готов выложить пример, а лишь пытаюсь докопаться до сути. Поиск в интернете показал, что это исключение появляется совершенно неожиданно во многих известных программах, можно дать в гугле 0x0eedfade и имя программы и скорее всего это исключение там появлялось... На форумах по Delphi пытаются отловить проблемные места используя try except, кто-то переписывает проблемный код хотя в нём нет явных ошибок, на форуме по Sound Empire проблему решали отключением интегрированной звуковой карты и много разных вариантов решения предлагают в сети. Единственное чего не удалось найти, так это внятного описания того из за чего и почему это появляется и как избежать подобного на стадии разработки. Ибо незнание и непонимание принципов возникновения этой проблемы не даёт гарантии, что отлично работающая и отлаженная программа будет работать на любом компьютере... Ну правда, тем же винампом пользуется огромное кол-во народа и только один на форуме пишет, что у него возникло такое исключение... Как быть? Прошу разбирающихся людей или встречавших подобную проблему просветить меня. |
|
Создано: 20 сентября 2009 21:08 · Личное сообщение · #2 |
|
Создано: 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 |
|
Создано: 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 |
|
Создано: 20 сентября 2009 21:38 · Поправил: Nowar · Личное сообщение · #5 В статье Данная ошибка присутствовала только в Delphi 6 до SP2. |
|
Создано: 20 сентября 2009 21:55 · Личное сообщение · #6 |
|
Создано: 20 сентября 2009 23:06 · Личное сообщение · #7 |
|
Создано: 21 сентября 2009 01:05 · Поправил: ToBad · Личное сообщение · #8 |
|
Создано: 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, перекомпилировал - таже фигня. |
|
Создано: 21 сентября 2009 01:18 · Поправил: uinor · Личное сообщение · #10 |
|
Создано: 21 сентября 2009 05:23 · Личное сообщение · #11 |
|
Создано: 21 сентября 2009 06:12 · Личное сообщение · #12 |
|
Создано: 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. |
|
Создано: 21 сентября 2009 09:43 · Личное сообщение · #14 ToBad У тебя запускает тред dll? Так для размышления, может быть именно тут ошибка. Если в main dll запускается тред, то фактически он будет только создан но не запушен, а запустится только тогда, когда закончится инициализация этой библиотеки. Может быть ты в том же main после создания потока чтото делаешь с результатами полученными после выполнения потока (который естественно не выполняется и результатов нет) И еще, где может быть ошибка, ты говоришь что dll что то мутит с сетью. Вот например функция InternetOpen или InternetConnect (не помню точно), при вызове подгружает еще какие то dll, к которых создаются дополнительные потоки, вот в этом случае, если ты вызываешь InternetOpen или InternetConnect а потом InternetReadFile из dll main, то последняя замораживается (т.к. созданные треды еще не выполняются) и возможно Delphi генерит такое исключение. |
|
Создано: 21 сентября 2009 09:55 · Личное сообщение · #15 ARCHANGEL пишет: Наверное, это была какая-то спец. сборка от дяди Васи в элитном подвале сборок? Нет. Это была Kernel32.dll версии 5.1.2600.5781 Ошибка по адресу 0x00012afb Вот |
|
Создано: 21 сентября 2009 16:13 · Личное сообщение · #16 |
|
Создано: 21 сентября 2009 16:40 · Личное сообщение · #17 |
|
Создано: 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, и устранить их (обстоятельства))), либо попробуй обрабатывать исключение. |
|
Создано: 21 сентября 2009 18:45 · Личное сообщение · #19 Valemox Это не догадки, а матчасть. NTSTATUS- коды формируются определённым образом(wrk, ntstatus.h): Code:
Если разобрать значение 0x0eedfade(00001110 11101101 11111010 11011110B), то получается что это не ошибка(Sev. 00 - Success), устройство не системное и не известно(Fac. 0xE). Даже без этого сразу видно что это не системный код ошибки. Такой сепшен может быть сгенерирован только програмно посредством сервиса NtRaiseException. |
|
Создано: 22 сентября 2009 02:42 · Личное сообщение · #20 |
|
Создано: 22 сентября 2009 08:11 · Личное сообщение · #21 |
|
Создано: 22 сентября 2009 11:07 · Личное сообщение · #22 |
|
Создано: 22 сентября 2009 13:10 · Личное сообщение · #23 Clerk пишет: Короче я против дельфе, фтопку его, он притупляет, это гуан среда. Зато проги дельфоские без декомпиля сложнее (на порядок сложнее) ломать, т.к. одна функция может содержать пять call'ов, внутри каждого из которых ещё 5, а там ещё 3, а там ещё 7 и т.д. Так что разрабы от делфей никогда не откажутся + скорость разработки. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 22 сентября 2009 15:05 · Личное сообщение · #24 ARCHANGEL пишет: Зато проги дельфоские без декомпиля сложнее (на порядок сложнее) ломать, т.к. одна функция может содержать пять call'ов, внутри каждого из которых ещё 5, а там ещё 3, а там ещё 7 и т.д. Так что разрабы от делфей никогда не откажутся + скорость разработки. Ну да, скорость разработки зачастую очень важна... Что касается кучи call'ов и прочего мусора, то многое конечно зависит от того, кто пишет... Можно активно использовать ассемблерные вставки или обращаться напрямую к функциям ws2_32, а можно использовать Indy и косячить как я в этом топике. |
|
Создано: 22 сентября 2009 16:49 · Личное сообщение · #25 |
|
Создано: 23 сентября 2009 11:15 · Личное сообщение · #26 |
|
Создано: 23 сентября 2009 12:45 · Личное сообщение · #27 |
|
Создано: 23 сентября 2009 13:20 · Личное сообщение · #28 |
|
Создано: 23 сентября 2009 18:12 · Личное сообщение · #29 |
|
Создано: 23 сентября 2009 18:52 · Личное сообщение · #30 _ruzmaz_ Вот так выдавало ексепшн: Code:
вот так не стало: Code:
Почему именно так реализовано не помню, давно дело было... Но думаю не только тут проблема. Ексепшины ещё бывают, но уже не тут... |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Исключение 0x0eedfade - откуда ноги растут? |