【发布时间】:2013-01-29 10:30:31
【问题描述】:
在我的 Delphi XE2 32 位应用程序(Update 4 Hotfix 1 Version 16.0.4504.48759)中,我使用 Format() 例程记录指针值。
例如:
Format('MyObject (%p)', [Pointer(MyObject)]);
但是,生成的字符串有时包含垃圾字符(例如,在这种情况下,用“?”或“|”代替十六进制数字):
MyObject (4E?|2010)
当用 '%x' 替换 '%p' 时,我也会得到相同的结果:
Format('MyObject (%x)', [Integer(MyObject)]);
但是,使用整数值总是有效的:
Format('MyObject (%d)', [Integer(MyObject)]);
MyObject (1291453120)
是否存在我不知道的错误,或者这是否与这里遇到的问题有关?
Why does Format crash when anything but "%s" is used with a Variant?
更新
我接受了 Jeroen 的回答,因为它通过消除过程引导我找到了解决方案。在通过 F7 启动应用程序的情况之后(根据评论),我认为在此过程的早期阶段肯定出了问题。凭直觉,我从它的 IDE 菜单中禁用了 madExcept,重新构建了应用程序,问题就消失了。显然,madExcept 链接到我的应用程序的任何代码都会导致 SysUtils 常量 TwoHexLookup 被覆盖。重新启用 madExcept 和重建(我没有进行任何其他更改)也有效,因此在链接阶段肯定存在一些损坏。
Jeroen 概述的用于检测内存损坏的策略是一个有用的练习,如果我遇到类似的情况应该证明是有价值的。
【问题讨论】:
-
如果这是真的,那肯定是一个错误......你有没有在一个空项目中发生过这种情况?
-
看起来像个bug,你有重现它的例子吗?
-
在你可以重现之前,这有点毫无意义。我们无能为力。您只需要一个简单的程序来演示故障。然后你提交一份质量控制报告。
-
@Doug:您可能错误地解释了结果吗?例如,
Format真的是System.Format吗?你用什么方法读取Format返回的字符串?你确定MyObject是你认为的那样吗?您的应用程序中是否存在内存损坏? -
感谢到目前为止的 cmets。 Andreas,我已经确认我正在调用 System.Format 以及所涉及的变量。 @David,感谢您澄清它不太可能是 RTL 中的错误,而是在我的代码中。如果我不能很快重现它,我会删除这个问题。 FWIW,我已经启用了 FastMM 中的所有选项(CheckForHeapCorruption、FullDebugMode 等),但到目前为止还没有出现任何东西。
标签: delphi memory delphi-xe2 string-formatting overwrite