Сейчас на форуме: jinoweb (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Исключение 0x0eedfade - откуда ноги растут? |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 20 сентября 2009 18:13 · Личное сообщение · #1 Последнее время стал часто замечать, что мои некоторые проекты на Delphi вдруг начинают вызывать исключение 0x0eedfade. Проявляется это не всегда и не везде. То есть на стадии разработки работало, прошло время - не работает. Отлавливал ошибку путём выкидывания некоторых участков кода, выводил в лог места которые удавалось пройти до проблемного момента, отлаживал пошагово и много времени провёл в гугле. На основе своих изысканий сделал вывод, что от приложения к приложению места могут быть разные, то есть например я использую функцию подсчета контрольной суммы, код помещен не в библиотеку, а идёт в виде функции в теле проекта, это модуль, сделав один, я делаю ещё 3 копии и вношу изменения. Таким образом получаю 4 длл с частью похожего кода но с разным назначением, где в одной вдруг начинает слетать в недрах функции подсчёта CRC, в то время как в остальных трёх этот код работает без проблем... Стоит закомментировать вызов функции, как всё работает без ошибок... Я не готов выложить пример, а лишь пытаюсь докопаться до сути. Поиск в интернете показал, что это исключение появляется совершенно неожиданно во многих известных программах, можно дать в гугле 0x0eedfade и имя программы и скорее всего это исключение там появлялось... На форумах по Delphi пытаются отловить проблемные места используя try except, кто-то переписывает проблемный код хотя в нём нет явных ошибок, на форуме по Sound Empire проблему решали отключением интегрированной звуковой карты и много разных вариантов решения предлагают в сети. Единственное чего не удалось найти, так это внятного описания того из за чего и почему это появляется и как избежать подобного на стадии разработки. Ибо незнание и непонимание принципов возникновения этой проблемы не даёт гарантии, что отлично работающая и отлаженная программа будет работать на любом компьютере... Ну правда, тем же винампом пользуется огромное кол-во народа и только один на форуме пишет, что у него возникло такое исключение... Как быть? Прошу разбирающихся людей или встречавших подобную проблему просветить меня. ![]() |
|
Создано: 24 сентября 2009 00:09 · Поправил: _ruzmaz_ · Личное сообщение · #2 Хм.. А ты же про функу говорил. ![]() Вне какого-то контекста этот код не выглядит особенно бажным ни со знаковым longint, ни с беззнаковым dword. К тому же пробовал компилить и выполнять - все норм было (в обоих случаях). Если это действительной из какой-то функции (а не процедуры), то здесь написан не весь ее код). Еще неплохо было бы знать как и где она используется, что в нее передается и что она возвращает. ![]() |
|
Создано: 24 сентября 2009 01:34 · Личное сообщение · #3 _ruzmaz_ пишет: Хм.. А ты же про функу говорил. Я уже всё исковеркал пока искал причину ошибки. Вообще ничего не пойму, сейчас другое место, в другой поделке глючит, но только на SP3. Код работает у меня на SP2 отлично, и если сделать отдельно от контекста - то и на SP3 глючное место работает. Это код завершения приложения который из длл вызывается, должен убить все треды и закрыть программу. Что интересно на этом месте и halt(1) заканчивается той же ошибкой... Может я некорректно завершаю приложения использующие треды? Сейчас качаю SP3 и буду смотреть на ошибку... Вот код завершения, где спёр не помню: Code:
![]() |
|
Создано: 24 сентября 2009 19:17 · Личное сообщение · #4 ToBad пишет: Это код завершения приложения который из длл вызывается, должен убить все треды и закрыть программу. Что интересно на этом месте и halt(1) заканчивается той же ошибкой... Он же завершает текущий процесс еще до Halt(1). Каким образом у тебя дело до холта доходит? ![]() Перелопачивать все и сразу не стоит - в дельфовом отладчике найди @RaiseExcept по байтам 68 DE FA ED 0E, ставь на ней бряк и посмотри откуда вызывается. ![]() |
|
Создано: 24 сентября 2009 20:01 · Личное сообщение · #5 |
|
Создано: 24 сентября 2009 20:40 · Личное сообщение · #6 |
|
Создано: 24 сентября 2009 21:53 · Личное сообщение · #7 |
|
Создано: 25 сентября 2009 13:10 · Личное сообщение · #8 Что-то я вообще залез в дебри. Большие подозрения, что всё глюки именно из за тредов и неправильной работы с ними. Попробовал делать с нуля, по правильному и по примерам работы с TThread, но тут же столкнулся с проблемой. Из Dll импортирована функция X, OEP указывает на вызов функции, затем прыгаем на оригинальный. Вот, что происходит по логу: Code:
Вот собственно код: Code:
Чувствую лохонулся где-то на элементарном. По идее IN THREAD PROC должен каждые 500 мс в логи идти. Как сделать что бы длл не деаттачилась, а тред крутился? Наверное нужно выкидывать dll из импорта, а там где вызываю функцию предварительно грузить dll через loadlibrary? Сейчас попробую... ![]() |
|
Создано: 25 сентября 2009 13:29 · Личное сообщение · #9 |
|
Создано: 25 сентября 2009 13:39 · Личное сообщение · #10 ToBad Попробуй сделать так, чтоб DllEntryPoint возвращала TRUE, а не что-нибудь. Т.е.: Code:
----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 25 сентября 2009 14:17 · Поправил: ToBad · Личное сообщение · #11 ARCHANGEL пишет: Попробуй сделать так, чтоб DllEntryPoint возвращала TRUE, а не что-нибудь Ага. Спасибо! Код поправил, попробовал true для возврата boolean и 1 для cardinal, уже не деаттачится! Теперь вторая проблема в неработающем треде: Code:
И сразу ещё один вопрос. Когда я выхожу из основной программы по Alt-F4 разве в мою длл не должен приходить деаттач? Или это только если я выгружаю с помощью FreeLibrary? ![]() |
|
Создано: 26 сентября 2009 16:04 · Личное сообщение · #12 ToBad пишет: Когда я выхожу из основной программы по Alt-F4 разве в мою длл не должен приходить деаттач? А разве в логе у тебя нет DEATTACH? У мну есть.) Правда у меня вместо лога месажбокс. ToBad пишет: Теперь вторая проблема в неработающем треде Пробовал разные варианты - работает либо без Synchronize, либо с Synchronize, но если TMyThread1 в том же проекте, в котором он используется. Если DoWork использует только своё, то забей)) на Synchronize. ![]() |
|
Создано: 27 сентября 2009 11:39 · Личное сообщение · #13 _ruzmaz_ пишет: А разве в логе у тебя нет DEATTACH? Неа. Вернулся к варианту тредов на API. Сейчас глюкает в момент убиения основной программы из треда функцией killthreads которую прилагал выше. Причём если в треде написать запуск другого EXE который и сделает killthreads для программы жертвы, то ошибки не возникает... Вот так вот через ж - работает. Пробовал останавливать треды и замораживать - те же яйца. Кстати не всё время это происходит, а раз на 3-5 выходов. p.s. Прошу не закрывать тему, к вопросу вернусь через неделю после командировки. ![]() |
|
Создано: 25 января 2016 23:23 · Личное сообщение · #14 |
|
Создано: 26 января 2016 01:41 · Личное сообщение · #15 Vostol пишет: К вопросу не вернулся, или из командировки не вернулся? Проблема актуальна. Шутники так и прут.Через 10 лет было бы еще актуальней.Для этого личка придумана.Не можете выйти на контакт - поспрашайте админов. Пора бы заняться уже древними тредами, чтобы археологов не смущать. ----- TEST YOUR MIGHT ![]() |
<< . 1 . 2 . |
![]() |
eXeL@B —› Программирование —› Исключение 0x0eedfade - откуда ноги растут? |