我有一些代码在Delphi 2007下可以正常工作,但在D2010下可以中断。它涉及传入一个字符串,将其转换为PWideChar(具体来说,是WideString指针,而不是UnicodeString指针),进行一些处理,然后在其上调用SysFreeString。直到传入空白字符串,然后SysFreeString中断,它才能正常工作。它调用了很多东西,最终在NTDLL.DLL内引发了Int 3断点。持续超过这一点将导致


项目引发异常类
$ C0000005,显示“访问权限”消息
在0x7747206e违反:读取
地址0x539b8dba'。


如果仔细观察,这不是标准的访问冲突消息。

到达Int 3时,堆栈跟踪的顶部看起来像这样:

:774e475d ; ntdll.dll
:774afad0 ; ntdll.dll
:774e5de9 ; ntdll.dll
:774a6dff ; ntdll.dll
:76fc1075 ; C:\Windows\system32\ole32.dll
:770e443a ; C:\Windows\system32\oleaut32.dll
:770e3ea3 oleaut32.SysFreeString + 0x4a


有人知道这是怎么回事吗?

编辑(从评论):


但是,这不是WideString。它的
由生成的PWideChar
StringToOleStr,并且没有
非空白时出现双精度错误
字符串被传入。不幸的是,我
不能真正发布代码示例
因为这是第三方
受版权保护的组件。 (和
我不能要求他们支持,因为
不再受支持。基本上,
整个事情变得一团糟。)

最佳答案

我将尝试进行心理调试。您的应用程序中发生了某种堆破坏,并且SysFreeString是不幸的受害者(很难知道没有OS符号,您可能应该为您的OS安装MSFT符号包)。

尝试为您的应用启用应用验证程序(尤其是pageheap),然后查看它是否崩溃了。

关于delphi - 是什么导致SysFreeString达到Int 3断点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3401415/

10-13 02:43