加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 格式和指针/十六进制值(内存覆盖)

发布时间:2020-12-15 09:25:41 所属栏目:大数据 来源:网络整理
导读:在我的Delphi XE2 32位应用程序(Update 4 Hotfix 1 Version 16.0.4504.48759)中,我使用Format()例程来记录指针值. 例如: Format('MyObject (%p)',[Pointer(MyObject)]); 但是,结果字符串有时包含垃圾字符(例如,在这种情况下,’?’或’|’代替十六进制数字)
在我的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中.
>如果它在TwoHexLookUp中,则设置数据更改断点(有关如何执行此操作,请参阅How to define a breakpoint whenever an object field value changes?和Add data breakpoint).
>运行您的应用程序,直到断点触发.

广告1:可能最简单的方法是查看TwoHexLookUp哪个值更改具有相同的效果来从s:= IntToHex获得错误的结果(2129827392,8);正如你在运行时观察到的那样.

星期四我正在客户端做一些Delphi工作,所以我可能有时间深入挖掘一下.

编辑
当您使用F7逐步完成您的过程时,您确实首先进入SysInit.

你可以做的就是在TwoHexLookup数组上设置一个断点.然后是F9 / F8 / F7(取决于你想要的粒度)并在Watch窗口中关注数组.这应该让你去.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读