为什么调试器不会将我带到生成 AV 的行?

Why the debugger won't take me to the line that generated an AV?

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

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

当我点击“继续”时,我看到了同样的错误。当我单击 'Break' 时,IDE 将打开 EMemLeaks.pas 单元。

程序在 'Debug' 模式下编译,包括所有调试信息。地图文件设置为详细信息。

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

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 个功能和 fixed 271 bugs。基本上每个新功能介绍他们也引入了近 3 个错误! EurekaLog 一定是有史以来最有问题的软件产品之一!

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

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

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

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

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

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