15

そのため、最近のいくつかの変更の後、最も古いアプリケーションの 1 つがシャットダウン時にクラッシュすることがあることがわかりました。これは、「実行時エラー 216」メッセージの形で、またはアプリケーションが動作を停止したことを示す Windows エラー報告からのメッセージとして現れます。アプリケーションはすでにOutputDebugStringすべてのターンでメッセージを発行しており、AFAICT によると、すべての独自のコードが最後まで正しく実行されます。すべてのデストラクタは、すべてのファイナライズ セクションおよびクラス デストラクタと同じように呼び出されますが、いずれも例外を発生させません。

また、madExcept と FastMM4 のフル デバッグ モードのどちらにも不満があるようには見えません (ただし、これらのコンポーネントの独自のファイナライズ コードが実行される前にクラッシュが発生する可能性があるため、これは誤った結論である可能性があります)。

それで、あなたは何をしますか?どこから始めますか?


この質問は、私が現在直面している特定のインスタンスに関するものではなく、このクラスの問題に対する一般的なアプローチに関するものであるため、意図的に詳細を省略しています。デバッグ アプローチの選択に関連する可能性があると思われる場合は、お気軽にお問い合わせください。後で追加します。

4

6 に答える 6

12

実行時エラー 216 は、Av (アクセス違反) があり、SysUtils がこれらのエラーの例外への変換を既に停止していることを意味します。

最初の試行: デバッグ DCU を使用してビルドし、エラーが発生した単位系を調べて、そこにブレークポイントを設定します。うまくいけば、デバッガーでそれをキャッチして、そこから作業できます。

おそらくメモリのバグ (ダングリング ポインター、null 参照など、既にファイナライズされたユニットでの s 文字列定数の使用) があり、sysutils がファイナライズされた後にファイナライズを確認するのが最善の方法です。これを行うには、WITH デバッグ DCU をビルドし、sysutils でブレーク ポイントをファイナライズに設定し、エラーが発生するまでコードのステップ実行を開始します。

于 2011-03-03T14:19:28.417 に答える
5

ランタイム パッケージを使用していますか? 以前にも同様の問題を見たことがあります。パッケージの境界を越えてグローバルまたはインターフェイスを共有している場合は、特定のパッケージに属するクラスへのすべての参照が、そのパッケージがアンロードされる前にクリーンアップされることを確認する必要があります。そうしないと、無効になったメモリに対して仮想呼び出しを実行しようとします。

于 2011-03-03T14:07:00.633 に答える
3

ランタイムエラー 216はメモリの問題 (アクセス違反) です。その時点では存在しないオブジェクトを参照しているようです。

エマカデロは次のように書いています。

SysUtils クラスを使用するアプリケーションは、ほとんどの実行時エラーを例外にマップします。これにより、アプリケーションは終了せずにエラーを解決できます。

Sysutils のファイナライズ セクションでブレークポイントを設定しようとしましたか?

Allocation / Memory Profiler で試してみます。エラー コード行が見つかるかどうかはわかりませんが、メモリの問題が発生したコードの一部が表示される場合があります。

于 2011-03-03T13:34:33.983 に答える
2

他の人が言ったように: 216 は、SysUtils がシャットダウンされた後の AV を意味します。通常、SysUtils の後にシャットダウンする (そして AV を上げる機会がある) 唯一のものは、システム ユニットです。具体的には、メモリ マネージャーです。

したがって、シャットダウン時の実行時エラー 216 は通常、アプリケーションのメモリ破損バグを意味します。

これは非常に簡単に解決できます。メモリ マネージャで完全なデバッグ モードを有効にするか、デバッグ メモリ マネージャを使用するだけです。ただし、非常に見つけにくい場合もあります。ただし、最初に MM のデバッグ モードから開始できます。

この記事を参照してください。

于 2011-03-03T21:48:58.443 に答える
2

「ランタイム エラー 216」は、Delphi 例外ハンドラではなく、Windows 自体からのものです。Delphi 例外ハンドラが起動する前に実行される、ユニットの初期化セクションとファイナライズ セクションで実行されるコードが原因であることがわかりました。特に。Delphi アプリの終了後に実行されるファイナライズ コードを介してアンロードする必要がある COM オブジェクトは、このエラーや同様のエラーを引き起こします。それで、そのことを確認してください。

MNG

于 2011-03-03T14:24:01.323 に答える
2

ポインタの問題が発生している可能性があります。イベントまたはメソッドが、もう存在しないオブジェクトで実行しようとしています。

于 2011-03-03T13:18:29.303 に答える