1

我在 Delphi 2007 上使用 madExcept + UPX 时遇到问题。每当我打开压缩的应用程序时,都会出现一个 Windows 异常对话框,代码为 0xc0000005。有人有解决方案吗?

谢谢!

4

5 回答 5

13

异常堆栈跟踪等需要将内存代码地址映射到存储在可执行文件中的虚拟地址,以便它们可以与 .map 文件或指示函数或源文件和行的调试信息相关联。通常,映射是直截了当且相对线性的。

可执行压缩搞砸了这一点,因为它没有直接的映射,尤其是不符合 PE 规范的映射。这是因为可执行压缩将可执行文件中的初始化例程替换为将数据从磁盘提取到内存中(这也意味着压缩的可执行文件不与其他实例共享页面,并且比未压缩的可执行文件使用更多的内存,因为它们需要一次所有的页面),然后转发到新扩展的原始初始化例程。

因此,如果在堆栈跟踪中没有非常巧妙的代码位置相对地址存储,这两种技术不太可能一起工作。

FWIW,我个人不建议使用可执行打包程序。

于 2009-03-02T20:27:53.360 回答
5

MadShi 自己的论坛已经对此进行了介绍:

论坛文章#1
论坛文章#2

周围还有很多其他主题,但总而言之,MadExcept 3.* 及之后的版本可以与 UPX 一起正常工作,但不能在下面。

于 2009-05-05T19:27:05.717 回答
3

该异常代码通常意味着它是未处理的外部异常。如果不使用 UPX 会怎样?异常会消失吗?

顺便说一句,它可能与 MadExcept 无关。该异常代码通常表明异常发生在可以设置 VCL 的异常处理程序之前,因此它也可能发生在 MadExcept 被挂钩之前。

编辑:从您的评论看来,UPX 的压缩技术可能会干扰 MadExcept/Delphi 连接异常处理程序链的能力。你检查了布鲁斯提供的链接吗?

于 2009-03-02T17:18:11.663 回答
0

使用 upx 尝试以下开关:

--compress-exports=0

于 2009-05-05T16:30:08.280 回答
0

我已经成功地将 madExcept 与 ASProtect 一起使用,所以我知道它可以与 exe 压缩一起使用。但是,UPX 可能存在一些特定问题

于 2009-03-02T17:42:10.607 回答