为什么调试器不会将我带到生成 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。
我有一个程序在关机时开始崩溃。调试器显示:
---------------------------
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。