8

解決に苦労している特定の状況でのみ発生する奇妙な断続的なクラッシュがあり、それに対処する方法について SO のアドバイスを求めています。

不具合

明らかにランダムな時点で、Windows は「[アプリ] が動作を停止しました」というダイアログを表示します。これは、ntdll.dll の APPCRASH、例外コード 4000001f、例外オフセット 000a2562 です。ここで注意が必要です。これは、アプリケーションをデバッガーで実行している場合にのみ発生します。ただし、デバッガーはこの例外をキャッチせず、Windows がこのダイアログを表示する時点で、IDE は応答していません。このバグは、通常の実行中、つまり IDE デバッガ内以外では発生しません。

Windows クラッシュ ダイアログのスクリーンショット

デバッガーの外で再現できないため、プログラムを実行して、既にクラッシュしているときにアタッチすることはできません。IDE が応答していないため、Windows がこのダイアログを表示したときに実行を一時停止できません。コード行を手動でトレースして、それが発生した場所を確認できますいくつかあり、発生する場所は明らかにランダムです。しばらくの間、ウィンドウ(または新しいフォーム)を表示するときに、スレッドを作成するときにしばらく発生しました。

編集: IDE まで追跡しました: ブレークポイントで一時停止して[スレッド ステータス] タブをクリックすると、理論的には一時停止していても、プログラムは上記のダイアログですぐにクラッシュします。この状況では、IDE は応答し続けます。これは本当に奇妙です。

詳しくは

開発環境をVMWare Fusionに移動しました。このバグは、新しいコンピューターで古い (ネイティブ Windows) コンピューターからのビルドを実行するときにも発生します。その古いコンピューターの同じ EXE ファイルでは発生しませんでした。これは、Fusion に関連しているのか、新しいセットアップの何かに関連しているのか疑問に思います。

私は走っています:

  • OSX Lion 10.7.1 上の WMWare Fusion 3.1.3 上の Windows 7 Pro x64、すべて完全に更新。Fusion が画面の 1 つで「フル スクリーン」モードで実行されています。
  • Windows 7 を (VM ではなく) ネイティブに実行している同僚は、この問題に遭遇しません。古いVistaコンピュータでもそうしませんでした。
  • Embarcadero RAD Studio 2010、完全に更新されました (5 つの更新があり、すべてを順番に取得するのは難しいと思います)。DDevExtensions 2.4.1 がインストールされており、最新の IDE フィックスパックもインストールされています。これらの両方をアンインストールしても効果はありません。
  • アプリケーションは、Delphi のスニペットを使用して、ほとんどが C++ で記述されています。32ビットです。
  • EurekaLogを使用しますが、例外もキャッチされません。(通常、例外は最初にデバッガーによってキャッチされ、次に EurekaLog によってキャッチされます。)
  • デバッグ ビルド (EurekaLog なし、追加のデバッグ情報など、デバッグ DCU を true に設定) を実行しても、それが再現されます。ただし、C++Builder プロジェクト設定ダイアログの [Delphi リンク] ページにある [DCU のデバッグ] オプションは効果がないようです。VCL コードにステップ インして、実際にエラーをトリガーする行を見つけることができません。
  • Codeguard (メモリ アクセス エラー、二重解放、解放されたメモリへのアクセス、バッファ オーバーランなどを検出します) は何も報告しません。
4

4 に答える 4

8

これには、メモリ破損のすべての特徴があります。これは、特定の1つの環境で実行した場合にのみ表示され、毎回異なる場所で発生します。両方の古典的な症状。

これをデバッグするために私が知っている最善の方法は、完全なFastMMをダウンロードし、完全なデバッグオプションを有効にして実行することです。

それでも問題が解決しない場合は、問題を特定できるまで、コードの一部を1つずつ削除することになります。

D2010で私が見たもう1つの問題は、ローカルクラス定義(つまり、クラス内のクラス)をジェネリックスと混合するときの問題です。生成されたコードは問題ありませんが、デバッグDCUが間違っており、コードをステップ実行すると、デバッガーが間違ったファイルにジャンプし、すぐに停止します。あなたはまったく同じ問題を抱えているようには見えませんが、IDEの死には類似点があります。

最後に、VMwareではなく独自のコードを疑うことをお勧めします。いつも何か他のことを責めたくなりますが、私の経験では、そうするたびに、それは常に私のコードでした!

于 2011-08-22T07:16:00.187 に答える
3

私はかなり似たような問題にぶつかりました。私は .dll も開発しており、コードの任意の場所にブレークポイントを設定すると、Delphi がソース コード行で停止し、ホスト アプリケーションがすぐにクラッシュしました。

デバッグ レイアウトで「スレッド ステータス ウィンドウ」を閉じると、問題が「修正」されました。私は Windows 7 64 ビットと Delphi XE3 で作業しています。

于 2013-06-26T14:47:19.613 に答える
2

4000001F は STATUS_WX86_BREAKPOINT です

つまりIDEで扱えなかったINT3です。

これは NTDLL で発生しているため、システム ヒープでメモリが破損していることを示していると思います。デバッガーで実行すると、一部の Windows コードはデバッガー バージョンに切り替わることに注意してください。アプリケーションがデバッガーの外部でスタンドアロンとして実行されている場合、ブレークポイントが生成されないため、これを再現できないのはそのためです。

完全なデバッグ モードで FastMM を試すこともできますが、役に立たないと思います。破損はメモリではなく、システム メモリで発生します。はい、おそらくメモリ割り当てスキームが変更されます-そして、あなたの破損はあなたのコード/メモリに現れます...そうかもしれません. トップダウン割り当てを使用してみてください、SafeMM を使用してみてください...

別の可能なアプローチは、Application Verifierを使用することです。

以下も参照してください。

于 2015-05-21T22:24:12.340 に答える