7

Internet Explorer が突然クラッシュし始めた Web サイトがあります。

Web サイトが読み込まれ、javascript の実行が開始されますが、どこかで機械が爆発します。スクリプト エラーは発生しません。クラッシュするだけです。組み込みのデバッガーを使用して js のすべての行を手動でステップスルーしようとしましたが、もちろん問題は発生しません。

アプリケーションがクラッシュしたときにアプリケーションをデバッグすることを選択すると、次のメッセージが表示されます。

iexplore.exe の 0x6c5dedf5 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000090。

コール スタックの上位 5 項目は次のようになります

VGX.dll!6c5dedf5()
[以下のフレームは正しくないか、見つからない可能性があります。VGX.dll のシンボルがロードされていません]
VGX.dll!6c594d70()
VGX.dll!6c594f63()
VGX.dll!6c595350()
VGX.dll !6c58f5e3()
mshtml.dll!6f88dd17()

VGX.dll は vml レンダラーの一部のようで、実際に VML を使用しています。私はvmlで非常に多くの問題を抱えていたので驚いていません.属性は特定の順序で設定する必要があります.DOMに要素が接続されている場合は属性を設定できない場合があります.通常、デバッグ時に再現できますが、現在は再現できません:(

この問題は、no plugin-mode でも発生します。

これを解決するための試行錯誤よりも良いアプローチはありますか?

編集: 疑わしいすべての変更をDOMに出力するコンソールを追加すると、問題が時々発生するだけになりました。(コンソールも同じページに JavaScript で実装されています。ウィンドウがまだ表示されているため、クラッシュした後でも出力を見ることができます) どうやら、ある種の競合状態のようです。

私はそれをさらに追跡することができました.DOMからオブジェクトを追加した直後にオブジェクトを削除すると発生するようです. (ほとんどの場合、何らかの特別な属性を持つ vml 要素の場合にのみ、それ以上試しませんでした) そして、removeChild の前にデッド ループを追加することによって修正することはできません (とにかくかなり悪い解決策です)。 removeChild を呼び出す前に、addChild の後でブラウザを 1 回呼び出します。はぁ

4

5 に答える 5

4

(古い質問ですが重要な質問です)

非常によく似た問題がありました - 多くの複雑な VML (Raphael から) が含まれており、デバッグがほぼ不可能に見えました。

実際、最も単純なローテク アプローチが最適であることが判明しました。これは明らかなアプローチです。私がここに書いているのは、威圧的な問題に直面したときに、明白で単純な解決策が最後に思い浮かぶことがあるためです。

だから、単純な昔ながらのデバッグ: コード内のリモートで要求の厳しい呼び出しや複雑な呼び出しの前後にたくさんのalert("1");などalert("2");があり、それ自体がクラッシュする可能性のある機能 (開発者ツールなど) に依存しない、非常に単純で信頼性の高いブレークポイントを提供します。次に、クラッシュする前にどの番号のアラートが表示されるかを確認します。問題は、そのアラートと次のアラートの間に発生する必要があります。

正確な行に絞り込むまで、さらにアラートを追加します。私の場合、実際には複雑な VML とは何の関係もありませんでした。IE7 でのみ、何らかの理由で無限に続く for ループでした。

于 2012-12-17T23:01:25.077 に答える
1

ヌル ポインター逆参照であり、悪用できないクラッシュです

于 2013-05-12T05:49:01.037 に答える
1

VML の使用を停止しますか?

画像の移動、拡大縮小、トリミング、および置換では実際に実行できないことが IE で必要な場合は、Flash、Silverlight などの使用を検討してください。

あなたの生活が VML に依存している場合は、他の人の経験についてできるだけ多くのことを読んでください。

于 2010-10-16T14:27:23.283 に答える
0

JSONP を何らかの形で使用していますか? jQuery などの一般的な実装では、実行後にスクリプト ノードを DOM から削除して、メモリをクリーンアップしようとする傾向があります。多くの場合、Internet Explorer がクラッシュするのを見てきました。それをクラッシュさせるために他にどのような条件が必要かを理解することはできませんでした. 私の他のページで起こっていることが多すぎます。

とにかく、jQuery.getJSON を使用している場合は、jquery ソースの次の行を確認してください: (jquery 1.4.3 の行 5556):

 } else {
  // Garbage collect
  window[ jsonp ] = undefined;

  try {
   delete window[ jsonp ];
  } catch( jsonpError ) {}
 }

 if ( head ) {
  head.removeChild( script );
 }

これを安全に削除するか、IE 以外のブラウザーでのみ発生するように条件付けすることができます。うまくいけば、それは役に立ちます。

于 2010-11-05T19:29:21.580 に答える
0

DOMReady イベントの発生後にスクリプトが実行されていることを確認してください。IE は、完全に読み込まれる前に DOM を変更するとクラッシュすることで有名です。

場合によっては、IE が時期尚早に DOMReady イベントを発生させることがあります。これを克服する方法の詳細については、こちらこちらを参照してください。

于 2010-11-04T16:01:22.973 に答える