delphi – 格式和指针/十六进制值(内存覆盖)
在我的Delphi XE2 32位应用程序(Update 4 Hotfix 1 Version 16.0.4504.48759)中,我使用Format()例程来记录指针值.
例如: Format('MyObject (%p)',[Pointer(MyObject)]); 但是,结果字符串有时包含垃圾字符(例如,在这种情况下,’?’或’|’代替十六进制数字): MyObject (4E?|2010) 将’%p’替换为’%x’时,我也得到相同的结果: 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? UPDATE 我接受了Jeroen的回答,因为它引导我通过消除过程来解决问题.在通过F7启动应用程序的情况之后(根据评论),我认为在此过程中必须出现问题.在预感,我禁用madExcept从其IDE菜单,重建应用程序,问题消失了.显然,无论代码madExcept链接到我的应用程序是什么导致在SysUtils常量TwoHexLookup中覆盖.重新启用madExcept和重建(我没有任何其他更改)也有效,因此在链接阶段肯定会有一些损坏. Jeroen提出的用于检测内存损坏的策略是一项有用的练习,如果我遇到类似的情况,它应该证明是有价值的. 解决方法
由于这似乎是内存覆盖(参见您的
comment到
user1008646),您可以尝试按照以下步骤操作:
>首先尝试找出被覆盖的内存地址.你提到s:= IntToHex(2129827392,8);失败.找出正确的值,然后找出它是否在TwoHexLookUp中. 广告1:可能最简单的方法是查看TwoHexLookUp哪个值更改具有相同的效果来从s:= IntToHex获得错误的结果(2129827392,8);正如你在运行时观察到的那样. 星期四我正在客户端做一些Delphi工作,所以我可能有时间深入挖掘一下. 编辑 你可以做的就是在TwoHexLookup数组上设置一个断点.然后是F9 / F8 / F7(取决于你想要的粒度)并在Watch窗口中关注数组.这应该让你去. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |