2

我有一个程序在关机时开始崩溃。调试器显示:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x00a69099: read of address 0x70687efe'.

当我单击继续时,我看到了同样的错误。当我单击“中断”时,IDE 将打开 EMemLeaks.pas 单元。
在此处输入图像描述

该程序在“调试”模式下编译,包含所有调试信息。地图文件设置为详细信息。
在此处输入图像描述

此外,我只在我的代码中使用 FreeAndNil 而不是 Free(但不在 3rd 方库中)。

StackTrace(来自 Delphi IDE):
在此处输入图像描述

在以下情况下不会出现崩溃:
- Eureka 插件被禁用或
- Eureka 插件被启用并且程序在 IDE 之外运行

崩溃出现在“Application.Run”之后的某个地方。这意味着我所有的清理代码都被执行了。正确的?

问题:
1. 以上设置是否正确?如果不是,要改变什么?
2. 调试器无法将光标放在产生问题的代码上是什么意思?
3. 这是否表明错误在我的代码之外?


更新(条条大路通尤里卡):

我设法删除了我项目中的所有代码。这就是剩下的:

INTERFACE
USES
  Winapi.Windows, Vcl.Forms,  Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Controls, Vcl.ExtCtrls, System.Classes,
  IdAntiFreeze, IdFTP, IdGlobal, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, Vcl.Grids;

TYPE
  TfrmDownloader = class(TForm)
    pgCrtl          : TPageControl;
    Splitter        : TSplitter;
    tabMain         : TTabSheet;
    lblTop          : TLabel;
    pnlGrid         : TPanel;
    Panel1: TPanel;
    IdFTP1: TIdFTP;
    btnUpdates: TButton;
    StringGrid1: TStringGrid;
    Panel2: TPanel;
    btnDownStart: TButton;
    RichEdit1: TRichEdit;
  private
  protected
  public
  end;

VAR
   frmDownloader: TfrmDownloader;
IMPLEMENTATION {$R *.dfm}
end.

该项目仍然崩溃。

更重要的是,运行一个名为 GenerateCrash 的程序将生成与我关闭程序(并且 Eureka 处于活动状态)时得到的完全相同的 AV:$C0000005。

procedure GenerateCrash;   
VAR T: TObject;
begin
 EmptyDummy;
 FreeAndNil(T);
 T.ClassName;
end;

让你思考。正确的?另外,EurekaLog 支持放弃了这个问题。可能他们现在知道了这个问题,它将在未来的某个版本中得到修复(我将无法访问)。我看到在每个版本中,他们都列出了很多严重的错误。自“v7.0 Hot-fix 1”发布以来,他们引入了 110 个功能并修复了 271 个错误。基本上,随着每个新功能的介绍,他们还引入了近 3 个错误!EurekaLog 必须是有史以来最有缺陷的软件产品之一!

4

1 回答 1

4

如果调试器具有可用于引发异常的源代码的调试信息,它会将您放到源代码中。它将为您的代码提供调试信息。但不适用于 RTL/VCL 代码等。对于双重释放,即使缺陷存在于您的代码中,异常也会经常发生在 RTL 代码中。

如果您启用调试 DCU,那么您更有可能获得成功。这样做可以让调试器访问 RTL/VCL 代码的调试信息。

不过,请查看 EurekaLog 堆栈跟踪。这应该有你需要解释的一切。

查看您的堆栈跟踪,AV 在外部 DLL 中引发,该 DLL 实现了 FastMM 的调试版本。通过查看该代码,您不会学到任何东西。您需要研究堆栈跟踪来解决您的问题。在引发访问冲突的地方将找不到答案。内存损坏错误经常属于这种性质。错误在远离缺陷的地方引发。

请注意,调试 FastMM 有时确实会引发随后忽略的 AV 异常。这些可能非常具有误导性。这可能发生在你身上。但是我在关机时没有遇到过,所以我仍然怀疑你有一个真正的缺陷。

也就是说,缺陷很可能存在于 EurekaLog 或您的配置方式中。如果你需要我的建议,我推荐 madExcept 而不是 EurekaLog。

于 2016-08-31T07:26:28.327 回答