我(我的应用程序的用户)遇到了奇怪的EAccessViolation错误,其中一段代码没有错误的编程逻辑。 DisplayData函数只是设置标签的标题 - 没有编译时错误,没有错误的数据发送到SysUtils.Format()函数。
MadExcept调用堆栈如下所示:
main thread ($1860):
00406a33 +067 MyApp.exe System 137 +0 Move
00452c9e +13e MyApp.exe System.SysUtils AddBuf
0045365d +931 MyApp.exe System.SysUtils WideFormatBuf
004528c0 +014 MyApp.exe System.SysUtils FormatBuf
00452ab4 +0c0 MyApp.exe System.SysUtils FmtStr
004529d2 +00e MyApp.exe System.SysUtils Format
004529b7 +01b MyApp.exe System.SysUtils Format
00b3aa55 +185 MyApp.exe mainunit 1506 +14 TMainForm.DisplayData
错误不会一直出现,函数可以被调用几次(相同参数)并且没有错误,然后是随机错误。
我猜这里有一些内存问题(有足够的可用内存) - 但不知道如何帮助用户 - 或者在哪里寻找原因。
对于这里可能发生的事情的任何想法?
......正如大卫要求展示真实代码的,这里有:
TRadioButton(rgOperation.Controls[Integer(SelectedItem.Operation)]).Caption :=
TRadioButton(rgOperation.Controls[Integer(SelectedItem.Operation)]).Caption +
Format(' %s',[SelectedItem.History.OperationOn.TargetStr]);
其中: rgOperation是一个TRadioGroup。组中有4个单选按钮。 SelectedItem.Operation是一个枚举(0..3)。 SelectedItem.History.OperationOn.TargetStr是一个字符串。对SelectedItem.History.OperationOn的调用中没有任何内容为零。
答案 0 :(得分:2)
如果
Format('%s', [SelectedItem.History.OperationOn.TargetStr])
会导致Format
内的访问权限违规,那么唯一合理的结论是
SelectedItem.History.OperationOn.TargetStr
无效。因此,SelectedItem.History.OperationOn
可能都有效,但TargetStr
无效。这可能不太可能,因为我认为TargetStr
是一个字符串,你必须努力工作来破坏字符串变量。
SelectedItem
或History
或OperationOn
更有可能无效。也许其中一个引用了一个被内存管理器破坏并重用的对象。您使用过时参考可能会导致您观察到的错误。
您可能会发现在完全调试模式下运行的完整FastMM内存管理器有助于识别故障。如果你在一个对象被销毁后使用它,那么完全调试FastMM很可能会为你识别它。