ログとデバッグの目的で、キャッチされていない GWT 例外 (GWT 2.5 rc1 を使用しています) をサーバーに送信しようとしています。例外スタック トレースの難読化を解除したいと考えています。そうしないと、ほとんど役に立ちません。
いくつかの調査の後、貴重な情報を含むGWTおよびWebModeExceptionsでの例外処理に関する 7 つのヒントを見つけました。
そこで、カスタム RPC サービスを使用してスタック トレースと共に例外を転送する GWT UncaughtExceptionHandler を作成しました。それはうまくいきます。
WebModeExceptions の難読化解除セクションで説明したように、GWT モジュールでこれを使用してスタックトレース エミュレーションを有効にしました。
<set-property name="compiler.stackMode" value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers"
value="true" />
スタックトレースは次のようになります。
com.google.gwt.core.client.JavaScriptException: (TypeError) : Cannot call method 'pp' of null
Unknown.aT(Unknown Source:174)
Unknown.AVa(Unknown Source:501)
Unknown.YF(Unknown Source:29)
Unknown.Lqb(Unknown Source:138)
...
WebModeExceptions deobfuscation sectionで説明されているように、必要と思われる難読化されたメソッド名と行番号が含まれているため、問題ないように思えます。
次に、GWT モジュールを -extra パラメーターを使用してコンパイルし、シンボルマップを取得します。
カスタム ログ サービスは、symbolMaps ディレクトリを使用して com.google.gwt.logging.server.StackTraceDeobfuscator を呼び出します。X-GWT-Permutation http ヘッダーを使用して難読化解除ツールを呼び出します。難読化解除メソッドを実行して、シンボル マップを読み込めることを確認しました。出来た。使用された symbolMap ファイル名が GWT モジュールの *.cache.js ファイル名と一致することを検証しました。それは一致します。
したがって、基本的に、サービスはこれを行います。
// Create the deobfuscator
String dir = getSymbolMapsDirPath();
StackTraceDeobfuscator deobfuscator = new StackTraceDeobfuscator(dir);
// request is the HttpServletRequest
String strongName = request.getHeader(RpcRequestBuilder.STRONG_NAME_HEADER);
// Deobfuscate the stack trace
exception.setStackTrace(
deobfuscator.deobfuscateStackTrace(exception.getStackTrace(), strongName));
// Log the exception
logger.severe("Uncaught GWT exception", exception);
最終的に、スタック トレースの難読化は解除されません。場合によっては、一部の行が間違ったクラスとメソッド名で難読化解除されることがありますが、それ以上はありません。symbolMap ファイルを見ると、スタック トレース内の実際のシンボルは、symbolMap ファイル内のどのシンボルとも一致しません。
ここで何が間違っているのか分かりますか?
編集: RemoteLoggingServiceImpl を試しましたが、同じ結果が得られました。