调用sysutils.now()时访问冲突

时间:2011-11-18 15:32:37

标签: delphi

我们的客户报告访问权限之一,不易重现。我们提供了日志记录机制。在检查日志时,我们注意到AV来自完全不同的不同操作。有时释放一个对象,有时在创建对象时有一些时间,同时调用sysutils.now()和许多其他操作。

我们对此感到困惑,在处理这个开发人员计算机时,我们也从sysutils.now()中提出了一个访问权限。

请注意,这是不可复制的。但是,如果我们考虑一段时间,我们的客户经常会获得访问权限。

我们正在使用eureka日志进行记录。在xp机器上发生问题。

计算机上安装的其他程序

Windows XP SP3,       Office 2007,       的Winzip,       树液,       Symantec防病毒和更新代理,       Altiris客户,       思科VPN客户端&       我们的德尔福计划。

任何帮助或提示将不胜感激。

谢谢, 罗勒

4 个答案:

答案 0 :(得分:2)

你应该在你的项目中使用FastMM4(我相信这实际上是最近的Delphi版本的一部分)。 FastMM4将捕获发生的泄漏和违规。您可能正遭受存储损坏,只能通过其对其他功能的影响来检测。

FastMM4有很多设置,所以请阅读文档

http://sourceforge.net/projects/fastmm/

是的,它是免费的。

答案 1 :(得分:1)

万一你想知道,这是now()

的源代码
function Now: TDateTime;
{$IFDEF MSWINDOWS}
var
  SystemTime: TSystemTime;
begin
  GetLocalTime(SystemTime);
  with SystemTime do
    Result := EncodeDate(wYear, wMonth, wDay) +
      EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
end;
{$ENDIF}
....
procedure GetLocalTime; external kernel32 name 'GetLocalTime';
....

使用madexcept
你的错误肯定不存在。解决方案是将调试信息添加到您的应用程序中 我热烈建议购买MadExcept(免费用于非商业用途):
http://madshi.net/madExceptDescription.htm

它将为您提供详细的堆栈跟踪(以人类可读的形式),您可以将其记录到文件中(或将自动通过电子邮件发送给您)。
在大多数情况下,这将为您提供追踪问题原因所需的信息 请注意,启用madexcept(完全)后,应用程序将运行缓慢,所以我建议您为客户端提供两个版本,这样他们就不必一直忍受缓慢。

答案 2 :(得分:0)

如前所述,如果没有一些源代码和更多背景知识,您可能很难满意地回答这个问题。

有一点需要注意:如果在释放对象时发生了对象,则该对象可能已被释放。如果您将手动对象清理与引用计数接口混合,则很容易发生这种情况。

  • 如果在接口refcount达到零之前释放了对象,AV将会 每当下一个接口引用超出范围或接口引用设置为nil时就会发生。
  • 如果接口refcount首先达到零,它将自动释放。如果稍后手动释放对象,则会发生AV,因为Free是实例方法且实例不再存在。

我也认为SysUtil.Now()可能是红鲱鱼。记录器更容易因内存损坏而感到困惑。

答案 3 :(得分:0)

当像Sysutils.Now这样简单的API开始崩溃时,我会开始寻找缓冲区溢出。这通常是最有可能的罪魁祸首。

如果是这种情况,callstack在找到问题的根源时几乎没用。我相信AQTime有一个工具可以追踪这类问题,但我从来没有将它用于此目的。