0

GWT アプリのクライアント部分で発生するバグ (おそらく NPE) があります。そして、それは展開されたときにのみ発生します。

私が得る唯一のメッセージは、JS コンソールの UmbrellaException です。スタックトレースも根本原因もありません。

gwt プラグインを使用してローカルでバグを再現することはできません。これにより、完全なスタック トレースが表示されます。

だから私は立ち往生しています。

方法はありますか:

  • クライアント例外をサーバーに記録しますか?
  • または、js コンソールでスタック トレースを出力しますか?

ありがとう

編集:将来の参考のために:gwtランナーではなくデプロイ時にバグが発生した場合、それはバグがコンパイルされたJSに関係しているためです。私の場合、正規表現の悪い実装です。

4

2 に答える 2

3

リモートサーバーで GWT dev モードを使用することができます。起動構成には、「-noserver」スイッチと正しい「-startupUrl」(リモート サーバーに対応) を含める必要があります。通常どおり、ローカル ブラウザからアクセスできます。

http://my-remote-server/example?gwt.codesvr=127.0.0.1:9997

HTTP ホストはリモート サーバーですが、「gwt.codesvr」はまだ localhost を指していることに注意してください。これは、アプリケーションが「my-remote-server」でサーバー側のコードを実行することを意味しますが、ローカルの Eclipse のクライアント コードを使用してデバッグできるようにします。つまり、URL に存在する「gwt.codesvr」は、GWT ブラウザー プラグインに、リモート サーバーに存在するコンパイル済みの JavaScript コードを使用する代わりに、localhost からオンザフライでコードをコンパイルするように指示します。これは、ローカル サーバーで再現できないクライアント側の例外をデバッグするのに非常に便利です。

于 2012-08-17T14:16:07.110 に答える
0

実行時例外をトラップするために、次の方法に頼りました。

  1. アプリのトラブルシューティング GWT モジュールを導入しましたMyAppSnapshot.gwt.xml。その中で、スタック トレース データを含めるように GWT コンパイラに要求しています。

    <?xml version="1.0" encoding="UTF-8"?>
    <module rename-to='client'>
       <inherits name='com.teknoscan.aims.ui.MyAppBase' />
       <set-property name="compiler.stackMode" value="emulated" />
       <set-configuration-property name="compiler.emulatedStack.recordFileNames" value="true" />
    </module>
    

    (MyAppProduction.gwt.xml上記のプロパティが削除された もあります。これらのプロパティの意味の詳細については、WebModeExceptionsを参照してください。)

  2. GWT.UncaughtExceptionHandler()がランタイム例外をキャッチしたときに表示されるペインをアプリに導入しました。ヘルパー メソッドは、利用可能な場合、スタック トレースのテキストを解析して設定します。

      public void setThrowable(Throwable caught) {
      if (!(caught == null || stackTraceTextArea == null)) {
         if (caught.getStackTrace().length == 0) {
            stackTraceTextArea.setText("No stack trace available.");
         } else {
            StringBuffer stb = new StringBuffer();
            stb.append(caught.getMessage() + "\n\nStack trace:\n");
            for (int i = 0; i < caught.getStackTrace().length; i++) {
               stb.append(caught.getStackTrace()[i].toString() + "\n");
            }
            stackTraceTextArea.setText(stb.toString());
         }
      }
    

    (少し重いですが、コンパイラ プロパティと組み合わせると、かなり読みやすい Java スタック トレース情報が得られます。生成される JS が大きくなり、ユーザーがスタック トレースを表示しない可能性があるため、製品ビルドには適していません。)

于 2012-08-17T20:55:14.407 に答える