2016-11-15 7 views
1

64ビット(Win7、Delphi XE7)の古いプログラムをコンパイルしようとしています。しかし、私はFastMMに問題があります。代わりにFastMM_FullDebugMode64.dllデバッグ情報(MAPファイル)が存在するときにFastMMが64ビットでクラッシュする

で、それがクラッシュしたリークレポートエラーを示すのである:

--------------------------- 
Debugger Exception Notification 
--------------------------- 
Project TestCompile.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'. 

enter image description here

この問題を再現するために必要なコードです:

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)パッケージで提供されています。

32ビットで動作します。 64ビットでは、IDe(デバッガ)で実行するとプログラムがクラッシュします。私はプログラムをリセットすることしかできません(Ctrl + F2)。 IDEの外では、プログラムは動作します(FastMMはIDEの外で実行しているときにログを表示しないように設定しています)。

更新: これは、デバッグ情報( 'マップファイル'の 'Delphiコンパイラ - >リンク'の存在)と関係があります。

+0

:http://stackoverflow.com/a/22685753/327083 –

+0

たちがあればログが正しく機能していないこと、そのため、推測することができ

もこのことを報告しましたこのデバッガの例外によって実行を続けるだけですか? –

+1

はい、私は実行を続けることができますが、私の問題は異なります。 @ IanGoldbyの質問では、FastMMは特定のケースでは機能していません。私のケースでは、FastMMはデフォルト/空のプロジェクトでAT ALLを使用していません。それはFastMMが64ビットで動作するようには設計されていなかったのですが(もちろん、これは言うまでもありません!64ビットで動作することは他にもあります) – Ampere

答えて

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

+0

私はこの問題を「デバッグ情報」に絞ることもできました(私の最後のコメントをご覧ください)。しかし、私の結論は、デバッグ情報が存在するとクラッシュするということです。あなたは反対です。 – Ampere

+0

1.古いDLL(2015)への参照を作成します。これは、このバグが回帰であることを意味しますか? 2. DLLをダウンロードできる場所があります(私にはJediはありません)?私は何百万人ものDelphi 64ビットユーザーにこのバグを持っている唯一の人だとは信じられません:)。 – Ampere

+0

1.これを再現するためにリポジトリに付属のDLLを使用しました。 2.自分で再コンパイルします。 JCLはオープンソースです。 3.おそらく誰もデバッグビルドでデバッグ情報を無効にしてプリコンパイルされたDLLを使用していたのではないでしょうか; –

関連する問題