问候
编辑:错误类型为:
错误:在模块“BoatLogisticsAMCAttracsServer.exe”中访问地址00404E78。读取地址FFFFFFDD
编辑2:感谢所有的建议。不幸的是,我认为解决方案比这更深入。我们使用了Bold for Delphi的补丁版本,因为我们拥有源代码。可能在Bold框架中引入了一些错误。是的,我们有一个由JCL处理的带有调用堆栈和跟踪消息的日志。因此,带有异常的调用堆栈可能如下所示:
20091210 16:02:29 (2356) [EXCEPTION] Raised EBold: Failed to derive ServerSession.mayDropSession: Boolean
OCL expression: not active and not idle and timeout and (ApplicationKernel.allinstances->first.CurrentSession <> self)
Error: Access violation at address 00404E78 in module 'BoatLogisticsAMCAttracsServer.exe'. Read of address FFFFFFDD. At Location BoldSystem.TBoldMember.CalculateDerivedMemberWithExpression (BoldSystem.pas:4016)
Inner Exception Raised EBold: Failed to derive ServerSession.mayDropSession: Boolean
OCL expression: not active and not idle and timeout and (ApplicationKernel.allinstances->first.CurrentSession <> self)
Error: Access violation at address 00404E78 in module 'BoatLogisticsAMCAttracsServer.exe'. Read of address FFFFFFDD. At Location BoldSystem.TBoldMember.CalculateDerivedMemberWithExpression (BoldSystem.pas:4016)
Inner Exception Call Stack:
[00] System.TObject.InheritsFrom (sys\system.pas:9237)
Call Stack:
[00] BoldSystem.TBoldMember.CalculateDerivedMemberWithExpression (BoldSystem.pas:4016)
[01] BoldSystem.TBoldMember.DeriveMember (BoldSystem.pas:3846)
[02] BoldSystem.TBoldMemberDeriver.DoDeriveAndSubscribe (BoldSystem.pas:7491)
[03] BoldDeriver.TBoldAbstractDeriver.DeriveAndSubscribe (BoldDeriver.pas:180)
[04] BoldDeriver.TBoldAbstractDeriver.SetDeriverState (BoldDeriver.pas:262)
[05] BoldDeriver.TBoldAbstractDeriver.Derive (BoldDeriver.pas:117)
[06] BoldDeriver.TBoldAbstractDeriver.EnsureCurrent (BoldDeriver.pas:196)
[07] BoldSystem.TBoldMember.EnsureContentsCurrent (BoldSystem.pas:4245)
[08] BoldSystem.TBoldAttribute.EnsureNotNull (BoldSystem.pas:4813)
[09] BoldAttributes.TBABoolean.GetAsBoolean (BoldAttributes.pas:3069)
[10] BusinessClasses.TLogonSession._GetMayDropSession (code\BusinessClasses.pas:31854)
[11] DMAttracsTimers.TAttracsTimerDataModule.RemoveDanglingLogonSessions (code\DMAttracsTimers.pas:237)
[12] DMAttracsTimers.TAttracsTimerDataModule.UpdateServerTimeOnTimerTrig (code\DMAttracsTimers.pas:482)
[13] DMAttracsTimers.TAttracsTimerDataModule.TimerKernelWork (code\DMAttracsTimers.pas:551)
[14] DMAttracsTimers.TAttracsTimerDataModule.AttracsTimerTimer (code\DMAttracsTimers.pas:600)
[15] ExtCtrls.TTimer.Timer (ExtCtrls.pas:2281)
[16] Classes.StdWndProc (common\Classes.pas:11583)
内部异常部分是在重新引发异常时的调用堆栈。
EDIT3: 目前的理论是虚拟内存表(VMT)出现了某些问题。当这种情况发生时,没有任何迹象。只有在调用方法时才会引发异常(始终在地址FFFFFFDD,即-35十进制),但此时已经太晚了。您不知道错误的真正原因。非常感谢任何有关如何捕获此类错误的提示!!!我们已尝试使用SafeMM,但即使使用3 GB标志,内存消耗也太高。所以现在我试图向SO社区提供悬赏:)
EDIT4: 一个提示是根据日志,通常(甚至总是)在此之前会有另一个异常。例如,可能是数据库中的乐观锁定。我们已经尝试强制引发异常,但在测试环境中它仍然正常工作。
EDIT5: 故事还在继续......我现在对过去30天的日志进行了搜索。结果:
- "读取地址 FFFFFFDB" 0
- "读取地址 FFFFFFDC" 24
- "读取地址 FFFFFFDD" 270
- "读取地址 FFFFFFDE" 22
- "读取地址 FFFFFFDF" 7
- "读取地址 FFFFFFE0" 20
- "读取地址 FFFFFFE1" 0
目前的理论是,一个枚举类型(在 Bold 中有很多)覆盖了一个指针。我得到了五个不同地址的结果。这可能意味着该枚举类型包含五个值,其中第二个值最常用。如果发生异常,则应回滚数据库并销毁 Boldobjects。也许有一种可能性,即并非所有内容都被销毁,而某个枚举类型仍然可以写入地址位置。如果这是真的,那么可能可以通过正则表达式搜索具有五个值的枚举类型的代码?
编辑6:总结一下,目前还没有解决问题的方法。我意识到我的调用堆栈可能会误导你。是的,其中有一个计时器,但也有其他没有计时器的调用堆栈。对此我感到抱歉。但有两个共同因素。
- 一个地址为 FFFFFFxx 的读取异常。
- 调用堆栈的顶部是 System.TObject.InheritsFrom(sys\system.pas:9237)
这使我相信VilleK最好描述了问题。 我也相信问题出现在 Bold 框架中。 但是,重要的问题是,如何解决此类问题? 像VilleK建议的断言是不够的,因为损坏已经发生,此时调用堆栈已经消失。因此,为了描述可能导致错误的内容:
- 某个指针被分配了错误的值 1,但也可以是 0、2、3 等。
- 将对象分配给该指针。
- 对象的基类中有方法调用。这会导致调用方法 TObject.InheritsForm 并在地址 FFFFFFDD 上出现异常。
这三个事件可以在代码中同时出现,但它们也可以在以后使用。我认为这对于最后一个方法调用是正确的。
编辑7: 我们与 Bold Jan Norden 的作者密切合作,他最近在 Bold 框架的 OCL 评估器中发现了一个错误。当这个错误被修复后,这种异常情况大大减少,但仍然偶尔发生。但是几乎解决了这个问题,这是一个很大的解脱。
if not ie.OwnsValue then ie.SetReferenceValue(nil);
- Roland Bengtsson