2

JavaScript コードに無限ループを記述しました。WebKit の Web Inspector を使用して、実行を終了するにはどうすればよいですか? Safari を終了し、再度開く必要があります (もちろんコードを変更した後)。

編集:より具体的には、ループを実行しているプロセス/スレッドに入って、ループが終了しない理由を確認する方法を探しています。類推は、^C を実行してプロセスに割り込むことができる GDB にあります。Web ブラウザを強制終了する方法を探しているわけではありません。私はすでにそれがかなり得意です。

4

4 に答える 4

1

私は WebKit に詳しくありませんが、これは私が通常次のようにデバッグする一般的な問題のように思えます。予想される反復の最大量。したがって、疑似コードでは、次のようなものを使用してこの問題をデバッグできます。

var iterations = 0;
var greatestPossibleNumberOfValidIterations = 500;
while(shouldLoopBooleanTest){
  iterations++;
  if(iterations>greatestPossibleNumberOfValidIterations){
     //do debugging/error handling
  }
} 

これが受け入れられた回答を保証するほど具体的であるとは思いませんが、問題の解決に役立つことを願っています.

于 2010-12-28T20:46:54.630 に答える
0

Firefox (質問で Firefox が指定されていないことはわかっていますが、誰かの役に立つ場合に備えてこれを入れています)、Safari、および Chrome を使用すると、無限に侵入する一貫した方法がないことがわかりました。ループしますが、必要に応じてループに入る実行をセットアップする方法があります。以下の私のテストコードを参照してください。

ファイアフォックス

まったくのゴミ。それはちょうどそこに立って、虹を回していました。私はそれを殺さなければなりませんでした。

サファリ

Safari の良いところは、停止するかどうかを最終的に尋ねるダイアログが表示されることです。はいと言うべきです。次に、ヒットcommand-option iして Web インスペクタを表示します。Javascript がタイムアウトを超えたことを示すソースがポップアップするはずです。右側の一時停止ボタンを上に向かって押してから、更新します。command-;コードがリロードされ、ステップスルーします:すべての呼び出しをステップスルーするので、私は使用するのが好きです。複雑なコードの場合、最後までたどり着けない可能性があります。continue( ) でもヒットしないでください。そうしないcommand-/と、振り出しに戻ります。

クロム

3 つの中で最も有用です。コードを単純にロードすると、永遠に続きます。ただし、ページをロードする前に、Web インスペクタを開き、[常にリソースをロードする] を選択してください。次に、ページをリロードします。ページの読み込み中にスクリプトをクリックして、実行中に Javascript を一時停止できます。これは私が探していたものです。

コード

<html>
  <head></head>
  <body onload="TEST.forever.loop()">
    Nothing
  </body>
  <script type="text/javascript">
    TEST = {};
    TEST.forever = {
      loop : function() {
        var i = 0;
        while (i >= 0) {
          i++;
        }
      }
    };
  </script>
</html>
于 2010-12-28T11:52:42.603 に答える
0

topプロセスツリーを見ようとしましたか?プログラムの PID を見つけて、次のように入力しkill -9 [PID]ます。

于 2010-12-19T06:02:19.580 に答える
0

F11を使ってみましたか?これは、ステップインの鍵です: https://trac.webkit.org/wiki/WebInspector

于 2010-12-28T05:13:15.423 に答える