8

Delphi 7 プロジェクトでは、FastMM をインストールしました。その後すぐに、フォームの 1 つが終了時に抽象エラー メッセージを発行し始めたことに気付きました。これを広範囲にデバッグしましたが、これまでのところ理由が見つかりません。このエラー メッセージの通常の理由は、ここには当てはまらないようです。アプリケーションは抽象クラスを定義しません。また、TStrings などの使用の可能性についてフォームを検索しました。最も重要なことは、このフォームに変更を加えていないことです (そうではないと思います)。壊れたばかりです。

  1. 実装されていないメソッドを呼び出そうとする以外に、このエラーの原因として考えられるものは他にありますか?
  2. FastMM が、今まで隠れていたアプリケーションのあいまいなバグを有効にした可能性はありますか?

これらの質問に対する答えが「いいえ」の場合は、実装されていないメソッド呼び出しを引き続き検索し、他に何かが欠けていないことに安心します。

4

5 に答える 5

12

メモリが破損している場合、あらゆる種類のエラーが発生する可能性があり、原因を特定するのは非常に困難です。

あなたの質問に答えるには: 1) はい、抽象エラーはメモリの破損によっても引き起こされる可能性があり、2) はい、FastMM を有効にすると、通常は気付かれないバグが表示される可能性があります (ただし、修正する必要があります)。

メモリエラーを見つけるための一般的なアドバイス:

  1. FastMM で "FullDebugMode" 設定を試してください。
  2. 作成するすべてが無料のものと一致していることを確認してください。
  3. 何回も解放されていないことを確認してください。
  4. オブジェクトが解放された後 (または作成される前) にオブジェクトが使用されていないことを確認してください。
  5. ヒントと警告をオンにします (発生した場合は修正します)。
于 2012-08-12T18:20:33.230 に答える
3

「それはただ壊れた」-それはおそらく常に壊れていたが、今あなたは知っている。

ボタンイベントの一部としてフォームを閉じるときに問題が発生しました。フォームが破棄され、残りのボタンメッセージが既存のボタンにディスパッチされます。Releaseメソッドは、(メモリから)wm_closeメッセージをフォームにポストバックすることでこれを回避します

于 2012-08-13T03:27:56.303 に答える
2

質問 1 への回答「実装されていないメソッドを呼び出そうとする以外に、このエラーの原因として考えられるものはありますか?」

はい。これが私の場合、抽象エラーの原因です:

TWinControl(Sender).Visible:= FALSE;        

これは、送信者が TButton の場合は機能しましたが、送信者が他のもの (TAction など) の場合は (もちろん) エラーが発生しました。それは明らかに私のせいでした。ハードタイプキャストの代わりに「as」を使用する必要がありました。

質問 2 への回答: はい。私もそれが起こっているのを見てきました。これは、FastMM にバグがあるという意味ではないことを明確にしておく必要があります。バグは「休眠状態」でした。FastMM はそれをトリガーしただけです。
実際には、問題を見つけるために FastMM にもっと頼るべきです。これを行うには、FastMM を完全なデバッグ モードに切り替えます。それはあなたを助けるでしょう:

オブジェクトが解放された後 (または作成される前) にオブジェクトが使用されていないことを確認してください。

また、いくつかのケースでは、プロジェクト全体が台無しになり、Abstract エラーが発生しました。DPROJ ファイルを削除するまで、何も機能しませんでした。現在の DPROJ ファイルと後ろのファイルを比較するだけで、IDE がどのようにファイルを作成するかがわかります。

コンパイラが表示するすべての警告も修正する必要があります。コンパイラはそれについて真剣です。正当な理由がなければ、警告は発生しません。それを修正すると、おそらく問題が修正されます。

この特定のケースでは、 all も に置き換え.FreeますFreeAndNil()

于 2014-08-29T09:59:59.923 に答える
2

プロジェクトに u_dzAbstractHandler を追加してみてください。メソッドが呼び出された場所で抽象エラーが発生するため、デバッグが容易になります。もちろん、これはデバッガーでの実行時にエラーが発生した場合にのみ役立ちます。

https://osdn.net/projects/dzlib-tools/scm/svn/blobs/head/dzlib/trunk/src/u_dzAbstractHandler.pas

于 2012-08-13T08:42:25.593 に答える