16

ログとデバッグの目的で、キャッチされていない 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 を試しましたが、同じ結果が得られました。

4

2 に答える 2

9

さらに調査した結果、使用していた新しい GWT コンパイラ オプション-XenableClosureCompilerは、コンパイラによって生成されたシンボル マップを使用するスタック トレースを出力しないコードを生成するようです。このオプションを削除すると、スタック トレースの難読化を正常に解除できます。

補足として、スタック トレースの難読化解除を有効にするために必要なコンパイラと GWT モジュール オプション (私の質問で説明し、クロージャ コンパイラ オプションを削除したもの) により、最終的な js ファイルは以前の 2 倍の大きさになります。

于 2012-11-09T18:27:35.433 に答える
0

問題の のバージョンはStackTraceDeobfuscator非推奨になりました。これが新しい方法です(実際にはそれほど違いはありません):

.gwt.xml ファイルでプロパティを設定します。

<set-property name="compiler.stackMode" value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers" value="true" />

次に、例外がサーバーに戻されたらRemoteServiceServlet:

import com.google.gwt.core.server.StackTraceDeobfuscator;
import com.google.gwt.user.client.rpc.RpcRequestBuilder;

String path = getServletConfig().getServletContext().getRealPath("/WEB-INF/deploy/<your module name>/symbolMaps/");
StackTraceDeobfuscator deobfuscator = StackTraceDeobfuscator.fromFileSystem(path);
String strongName = getThreadLocalRequest().getHeader(RpcRequestBuilder.STRONG_NAME_HEADER);

// Do the magic
deobfuscator.deobfuscateStackTrace(exception, strongName);

// Log it
logger.severe("Uncaught GWT exception", exception);
于 2019-05-15T11:48:30.307 に答える