Delphi 当存在调试信息(映射文件)时,FastMM在64位上崩溃
我正在尝试编译一个64位的旧程序(Win7,delphixe7)。但是,我对FastMM有一个问题。它没有显示泄漏报告,而是在FastMM_FullDebugMode64.dll中崩溃 错误是:Delphi 当存在调试信息(映射文件)时,FastMM在64位上崩溃,delphi,crash,access-violation,fastmm,Delphi,Crash,Access Violation,Fastmm,我正在尝试编译一个64位的旧程序(Win7,delphixe7)。但是,我对FastMM有一个问题。它没有显示泄漏报告,而是在FastMM_FullDebugMode64.dll中崩溃 错误是: --------------------------- Debugger Exception Notification --------------------------- Project TestCompile.exe raised exception class $C0000005 with me
---------------------------
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.
正如您所见,没有个人/第三方代码。所有这些都是用Delphi代码完成的。
DLL是FastMM(4.992/2016)软件包提供的DLL 它在32位上工作。在64位上,如果我在IDe(调试器)下运行,它会使程序崩溃。我只能重置程序(ctrl+f2)。在IDE之外,程序只是工作(FastMM被配置为在IDE之外运行时不显示日志) 更新:
这与存在调试信息有关(“Delphi编译器->链接”下的“映射文件”) 存储库中包含的预编译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,它不再崩溃
还报告了这一点:是的,我可以继续执行,但我的问题不同。在@IanGoldby的问题中,FastMM在特定情况下不起作用。在我的例子中,FastMM根本不在默认/空项目上工作。这就像FastMM不是为64位设计的(但我不是这么说的!!显然它是为64位设计的-对于其他人来说)引用@davidheffernan-“是的,这非常令人沮丧,直到你意识到你的代码没有问题!”。我想我的设置有问题!是的,我理解-我只是想确保这是一个真正的错误,而不仅仅是FastMM中的一个偶然(正常)异常,否则不会对其运行产生不利影响。我无法重现您的问题。创建一个新的空白VCL应用程序button,TStringList.Create,将FULLDEBUGMODE添加到defines,将FastMM4添加到dpr使用中,将64位dll(来自FastMM repo的预编译文件夹)放入exe旁边的目录,调试应用程序。得到了泄漏对话框和带有调用堆栈的文本文件。我在使用64 dll时也遇到了同样的问题。当有一个映射文件时它会崩溃,你解决了问题吗?我还设法将问题缩小到“调试信息”(请参阅我最后的评论)。但是,我的结论是,当存在调试信息时,它会崩溃。你说的正好相反。您引用了一个旧的DLL(2015)。这意味着这个bug是一个回归?2.有一个地方可以下载DLL(我没有绝地武士)?3.我不敢相信我是唯一一个在数以百万计的Delphi 64位用户中有这个bug的人:)或者。。。。社区越来越小了。你不明白!在我的情况下,“调试信息”已启用。只有在我启用它时才会出现崩溃!!!!!默认项目(默认情况下禁用调试信息)不会出现崩溃:)奇怪,对吧?我是64位Delphi的早期采用者之一。我从不使用64位调试器。因为它太脆弱了。“因为它太脆弱了”-(作为经验法则),我们应该在发布3-5个版本(年)后使用Embarcadero版本(64位、fmx、vcl样式等)的技术。在最初的几年里,他们是不稳定的。我们希望柏林德尔福(Delphi Berlin)能改变这种情况(他们似乎已经修复了一长串的bug)