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