У меня проблемы с использованием madExcept + UPX в Delphi 2007. Всякий раз, когда я открываю сжатое приложение, появляется диалоговое окно исключения Windows с кодом 0xc0000005. У кого-нибудь есть решение для этого?
Спасибо!
У меня проблемы с использованием madExcept + UPX в Delphi 2007. Всякий раз, когда я открываю сжатое приложение, появляется диалоговое окно исключения Windows с кодом 0xc0000005. У кого-нибудь есть решение для этого?
Спасибо!
Трассировка стека для исключений и т. д. требует сопоставления адресов кода в памяти с виртуальными адресами, хранящимися в исполняемом файле, чтобы их можно было сопоставить либо с файлом .map, либо с отладочной информацией, которая указывает функцию или исходный файл и строку. Обычно отображение является прямым и относительно линейным.
Сжатие исполняемого файла все портит, потому что у него нет прямого сопоставления, особенно такого, которое не соответствует спецификации PE. Это связано с тем, что сжатие исполняемого файла заменяет процедуру инициализации в исполняемом файле процедурой, которая извлекает данные с диска в память (это также означает, что сжатые исполняемые файлы не делят страницы с другими экземплярами и используют больше памяти, чем несжатые исполняемые файлы, поскольку им необходимо страницу во всем сразу), прежде чем перенаправить в недавно расширенную исходную процедуру инициализации.
Таким образом, без довольно умного хранения относительных адресов местоположений кода в трассировке стека маловероятно, что эти два метода будут работать вместе.
FWIW, я лично не рекомендую использовать исполняемые упаковщики.
Это уже обсуждалось на собственных форумах MadShi:
Статья форума №1
Статья форума №2
Существует дюжина других тем, но, если подытожить длинную историю, известно, что MadExcept 3.* и более поздние версии нормально работают с UPX, а ниже — нет.
Этот код исключения обычно означает, что это необработанное внешнее исключение. Что произойдет, если вы не используете UPX? Исключение исчезает?
Кстати, это может не иметь никакого отношения к MadExcept. Этот код исключения обычно указывает на то, что исключение произошло до того, как можно было настроить обработчики исключений VCL, и, следовательно, это, вероятно, произошло бы до того, как MadExcept также подключится.
РЕДАКТИРОВАТЬ: Из вашего комментария кажется, что техника сжатия UPX может мешать способности MadExcept/Delphi подключать цепочку обработчиков исключений. Вы проверили ссылку, предоставленную Брюсом?
Я успешно использовал madExcept с ASProtect, поэтому я знаю, что его можно использовать со сжатием exe. Однако могут быть определенные проблемы с UPX.
Попробуйте следующий переключатель с upx:
--compress-экспорт = 0