【发布时间】:2016-11-16 02:02:38
【问题描述】:
我正在尝试为 64 位(Win7、Delphi XE7)编译一个旧程序。但是,我对 FastMM 有疑问。它没有显示泄漏报告,而是在 FastMM_FullDebugMode64.dll 中崩溃
错误是:
---------------------------
Debugger Exception Notification
---------------------------
Project TestCompile.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
这是重现问题所需的代码:
program TestCompile;
uses
fastmm4,
Vcl.Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
UNIT Unit1;
...
IMPLEMENTATION
VAR TSL: TStringList;
procedure TForm1.Button1Click(Sender: TObject);
begin
TSL:= TStringList.Create; // we generate a leak here. fastmm should report this
end;
end.
如您所见,没有个人/第 3 方代码。一切都通过 Delphi 代码完成。
该 DLL 是 FastMM (4.992/2016) 软件包提供的一个。
它适用于 32 位。在 64 位上,如果我在 IDe(调试器)下运行,它会使程序崩溃。我只能重置程序(ctrl+f2)。在 IDE 之外,该程序正常工作(FastMM 配置为在 IDE 之外运行时不显示日志)。
更新: 这与调试信息的存在有关(“Delphi 编译器 -> 链接”下的“映射文件”)。
【问题讨论】:
-
是的,我可以继续执行,但我的问题不同。在@IanGoldby 的问题中,FastMM 不适用于特定情况。就我而言,FastMM 在默认/空项目上根本无法工作。就像 FastMM 不是为 64 位而设计的(但我不是这么说的!显然它适用于 64 位——对于其他人来说)
-
引用@davidheffernan - “是的,直到您意识到您的代码没有任何问题之前,这非常令人沮丧!”。我认为我的设置有问题!
-
是的,我明白 - 我只是想确保这是一个真正的错误,而不仅仅是 FastMM 中的一个杂散(正常)异常,不会对其操作产生不利影响。
-
我无法重现您的问题。创建一个新的空白 VCL 应用程序,按钮,TStringList.Create,将 FULLDEBUGMODE 添加到定义,将 FastMM4 添加到 dpr 使用,将 64 位 dll(来自 FastMM 存储库的预编译文件夹)放入 exe 旁边的目录,调试应用程序。得到了泄漏对话框和带有调用堆栈的文本文件。
-
我在使用 64 dll 时遇到了同样的问题。有地图文件就崩溃了,你解决了吗?
标签: delphi crash access-violation fastmm