最近,我们收到了一位用户的错误报告:屏幕上的某些内容在我们的软件中显示不正确.不知何故,我们无法在我们的开发环境中重现这一点(Delphi 2007).
一些经进一步研究后,似乎这个bug 只表现在"代码优化"被打开的.
在这里有没有人有打猎这样的海森堡的经验?在Delphi软件中通常会导致此类问题的任何特定构造或编码错误?你会开始寻找任何地方吗?
我也将以通常的方式开始调试整个事情,但任何特定于与优化相关的错误(*)的提示都将受到欢迎!
(*)注意:我并不是说错误是由优化器引起的; 我认为代码中某些不稳定的构造更有可能被优化器"推到边缘".
这似乎错误归结到时有没有代码优化的纪录被完全零初始化,并且包含一些随机数据相同的记录时存在的优化.在这种情况下,随机数据似乎导致枚举类型包含无效数据(令我惊讶的是!).
该解决方案最终涉及到代码深处某处的单元化本地记录变量.显然,没有优化,记录被重置(堆?),并且在启用优化的情况下,记录被通常的垃圾填满.感谢大家的贡献 - 我一路上学到了很多东西!
moo*_*dow 12
通常这种形式的错误是由无效的内存访问(读取未初始化的数据,读取缓冲区的末尾......)或线程竞争条件引起的.
前者将受到优化的影响,导致数据布局在内存中重新排列,和/或可能通过将新分配的内存初始化为某个值的调试代码; 导致错误的代码"意外工作".
由于优化级别之间的时序变化,后者将受到影响.前者通常更有可能.
如果你有一些自动方式使新分配的内存在传递给程序之前填充一些常量值,这会使崩溃消失或在调试版本中变得可重现,这将提供一个开始追逐的好点的东西.
很可能是一个内存与寄存器问题:你在免费后依赖于内存持久性运行良好的程序.
我建议在完全调试模式下使用FastMM4运行您的应用程序,以确保您的内存管理.
在这种情况下非常有用的另一种(非自由)工具是Eurekalog.
我见过的另一件事是:当调用一些外部代码(DLL,COM ......)时,FPU寄存器崩溃,而调试器一切正常.
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |