【问题标题】:FastMM crashes on 64 bits when debug info (MAP file) is present存在调试信息(MAP 文件)时,FastMM 在 64 位上崩溃
【发布时间】: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


【解决方案1】:

看起来存储库中包含的预编译 64 位 DLL 已过时,并且不反映过去所做的更改。

当可执行文件不包含调试信息时,可能会发生崩溃。

来自 FastMM_FullDebugMode.dpr

Version 1.61 (5 September 2010):
  - Recompiled using the latest JCL in order to fix a possible crash on shutdown
    when the executable contains no debug information. (Thanks to Hanspeter
    Widmer.)

使用最近的 JCL 重新编译 DLL,它不再崩溃。

还报告了这个:https://github.com/pleriche/FastMM4/issues/27

【讨论】:

  • 我还设法将问题缩小到“调试信息”(请参阅​​我的最后一条评论)。但是,我的结论是,当存在调试信息时它会崩溃。你说反了。
  • 1.您引用了旧的 DLL (2015)。这意味着这个错误是回归? 2.有什么地方可以下载DLL(我没有Jedi)? 3. 我不敢相信我是数百万 Delphi 64 位用户中唯一有这个错误的人:) 或者....是社区越来越小。
  • 3.你不懂!在我的情况下,启用了“调试信息”。只有当我启用它时才会出现崩溃!!!!!!默认项目(调试信息被默认禁用)不会出现崩溃:)很奇怪,对吧?
  • 我是 64 位 Delphi 的早期采用者之一。我从不使用 64 位调试器。因为它太片状了。
  • “因为它太不稳定了”-(根据经验)我们应该在发布后 3-5 个版本(年)使用 Embarcadero 发布的技术(64 位、fmx、vcl 样式等)释放。他们在头几年很不稳定。让我们希望这会随着 Delphi Berlin 改变(他们似乎已经修复了相当长的错误列表)
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2013-05-01
相关资源
最近更新 更多