【问题标题】:Sporadic Access Violation in TJvMemoryData.InternalSetFieldDataTJvMemoryData.InternalSetFieldData 中的零星访问冲突
【发布时间】:2020-06-10 14:54:58
【问题描述】:

我正在尝试解决此代码中出现的 Delphi XE7 应用程序中的访问冲突,该代码是 Jedi VCL JvMemoryDataset 组件的一部分(Github 上的当前 source):

begin
  Data^ := Ord(Buffer <> nil);
  Inc(Data);
  if Buffer <> nil then
    Move(Buffer^, Data^, CalcFieldLen(Field.DataType, Field.Size)) <---------- AV here
  else
    FillChar(Data^, CalcFieldLen(Field.DataType, Field.Size), 0);
end;

代码偶尔会导致地址 04020111 发生读取访问冲突。此代码是否存在明显问题? (CalcFieldLen 可能返回 0,不确定这是否与此处相关)。

我检查了 JVCL 的当前开发版本,并且 Move 调用与我的(旧)本地版本中的相同。

可能与https://issuetracker.delphi-jedi.org/view.php?id=6276的问题有关


相关(带调试建议):Sporadic Access Violation after porting from D2006 to XE5, doesn't happen in XP compatibility mode

【问题讨论】:

  • 不能说我看到任何明显的错误。它是否总是在相同的字段类型上,并且 ftSupported 集中的字段类型是否从第 410 行开始(根据上一行中的警告)?您的应用使用什么计算字段类型?
  • @MartynA 调试实际的 AV 将非常困难/耗时 - AV 仅在数千个函数调用中出现一次。我怀疑这是一些内存分配/释放错误的副作用,下周将使用不同的内存管理器进行测试。非常感谢您的观看!

标签: delphi access-violation jvcl


【解决方案1】:

将 FireDAC 查询的 FetchOptions.Unidirectional 属性切换为 True 后,访问冲突消失了。 (属性默认值为False)

我猜这个访问冲突是由低内存情况下的内存损坏引起的。 FireDAC 查询已关闭并重新打开(对大型数据集进行分页),因此在加载的数据量很大时会发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多