无法对 GWT 堆栈跟踪进行反混淆
我们尝试将未捕获的 GWT 异常(我们使用 GWT 2.5 rc1)发送到我们的服务器以进行日志记录和调试。我们想要对异常堆栈跟踪进行去模糊处理,否则它几乎毫无用处。
经过一些调查,我在GWT和WebModeExceptions中发现了7个异常处理技巧,其中包含有价值的信息。
因此,我们创建了一个 GWT UncaughtExceptionHandler,它使用自定义 RPC 服务来传输异常及其堆栈跟踪。这工作正常。
如 WebModeExceptions deobfuscation 部分中所述,我们在 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解混淆部分中描述的所需的。
然后,我们使用 -extra 参数编译 GWT 模块,以获得符号映射。
我们的自定义日志服务使用 symbolMaps 目录调用 com.google.gwt.logging.server.StackTraceDeobfuscator。我们使用 X-GWT-Permutation http header 来调用去混淆器。我逐步执行了去模糊化方法,以确保它可以加载符号映射。它可以。我验证了使用的符号映射文件名是否与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);
最终结果是堆栈跟踪不会进行反混淆。有时,某些行会使用错误的类和方法名称进行 deobufscated,但仅此而已。查看 symbolMap 文件时,堆栈跟踪中的实际符号与 symbolMap 文件中的任何符号都不匹配。
你知道我们在这里做错了什么吗?
编辑:我尝试了RemoteLoggingServiceImpl,我得到了相同的结果。