madExcept + UPX

У меня проблемы с использованием madExcept + UPX в Delphi 2007. Всякий раз, когда я открываю сжатое приложение, появляется диалоговое окно исключения Windows с кодом 0xc0000005. У кого-нибудь есть решение для этого?

Спасибо!


person gmuller    schedule 02.03.2009    source источник


Ответы (5)


Трассировка стека для исключений и т. д. требует сопоставления адресов кода в памяти с виртуальными адресами, хранящимися в исполняемом файле, чтобы их можно было сопоставить либо с файлом .map, либо с отладочной информацией, которая указывает функцию или исходный файл и строку. Обычно отображение является прямым и относительно линейным.

Сжатие исполняемого файла все портит, потому что у него нет прямого сопоставления, особенно такого, которое не соответствует спецификации PE. Это связано с тем, что сжатие исполняемого файла заменяет процедуру инициализации в исполняемом файле процедурой, которая извлекает данные с диска в память (это также означает, что сжатые исполняемые файлы не делят страницы с другими экземплярами и используют больше памяти, чем несжатые исполняемые файлы, поскольку им необходимо страницу во всем сразу), прежде чем перенаправить в недавно расширенную исходную процедуру инициализации.

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

FWIW, я лично не рекомендую использовать исполняемые упаковщики.

person Barry Kelly    schedule 02.03.2009

Это уже обсуждалось на собственных форумах MadShi:

Статья форума №1
Статья форума №2

Существует дюжина других тем, но, если подытожить длинную историю, известно, что MadExcept 3.* и более поздние версии нормально работают с UPX, а ниже — нет.

person Fabricio Araujo    schedule 05.05.2009
comment
Да, я знаю это. Я использую UPX в нескольких других приложениях, но есть конкретное приложение, которое не работает. - person gmuller; 07.05.2009

Этот код исключения обычно означает, что это необработанное внешнее исключение. Что произойдет, если вы не используете UPX? Исключение исчезает?

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

РЕДАКТИРОВАТЬ: Из вашего комментария кажется, что техника сжатия UPX может мешать способности MadExcept/Delphi подключать цепочку обработчиков исключений. Вы проверили ссылку, предоставленную Брюсом?

person Ken White    schedule 02.03.2009
comment
Программа работает гладко без UPX. - person gmuller; 02.03.2009

Я успешно использовал madExcept с ASProtect, поэтому я знаю, что его можно использовать со сжатием exe. Однако могут быть определенные проблемы с UPX.

person Bruce McGee    schedule 02.03.2009

Попробуйте следующий переключатель с upx:

--compress-экспорт = 0

person Community    schedule 05.05.2009