在SysUtils.Format / System.Move中查找随机EAccessViolation的原因

时间:2015-03-06 09:29:22

标签: delphi access-violation

我(我的应用程序的用户)遇到了奇怪的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的调用中没有任何内容为零。

1 个答案:

答案 0 :(得分:2)

如果

Format('%s', [SelectedItem.History.OperationOn.TargetStr])

会导致Format内的访问权限违规,那么唯一合理的结论是

SelectedItem.History.OperationOn.TargetStr

无效。因此,SelectedItem.History.OperationOn可能都有效,但TargetStr无效。这可能不太可能,因为我认为TargetStr是一个字符串,你必须努力工作来破坏字符串变量。

SelectedItemHistoryOperationOn更有可能无效。也许其中一个引用了一个被内存管理器破坏并重用的对象。您使用过时参考可能会导致您观察到的错误。

您可能会发现在完全调试模式下运行的完整FastMM内存管理器有助于识别故障。如果你在一个对象被销毁后使用它,那么完全调试FastMM很可能会为你识别它。