我在使用Delphi 2007上的madExcept + UPX时遇到问题。 每当我打开压缩的应用程序时,都会出现一个Windows异常对话框,代码为0xc0000005。 任何人都有解决方案吗?
谢谢!
答案 0 :(得分:13)
对异常等进行堆栈跟踪需要将内存中的代码地址映射到存储在可执行文件中的虚拟地址,以便它们可以与.map文件或指示函数或源文件和行的调试信息相关联。通常,映射是直截了当且相对线性的。
可执行压缩可以解决这个问题,因为它没有直接的映射,特别是没有符合PE规范的映射。这是因为可执行压缩将可执行文件中的初始化例程替换为将数据从磁盘提取到内存中的初始化例程(这也意味着压缩的可执行文件不与其他实例共享页面,并且使用比未压缩的可执行文件更多的内存,因为它们需要在转发到新扩展的原始初始化例程之前,将所有内容中的所有内容都放在一起。
因此,如果堆栈跟踪中的代码位置没有非常聪明的相对地址存储,则这两种技术不太可能一起工作。
FWIW,我个人不建议使用可执行的打包程序。
答案 1 :(得分:5)
MadShi自己的论坛已经介绍过了:
Forum Article #1
Forum Article #2
还有十几个其他主题,但总结一下, MadExcept 3. *和after已知可以正常使用UPX,而不是。
答案 2 :(得分:3)
该异常代码通常意味着它是一个未处理的外部异常。如果您不使用UPX会发生什么?例外情况会消失吗?
它可能与MadExcept,BTW没有任何关系。该异常代码通常表示异常发生在VCL的异常处理程序可以设置之前,因此它可能在MadExcept被引入之前。
编辑:从您的评论来看,听起来UPX的压缩技术可能会干扰MadExcept / Delphi连接异常处理程序链的能力。你查看了Bruce提供的链接吗?答案 3 :(得分:0)
我已成功使用带有ASProtect的madExcept,所以我知道它可以与exe压缩一起使用。但是,可能会有一些特定的problems with UPX。
答案 4 :(得分:0)
使用upx尝试以下开关:
- 压缩出口= 0