【问题标题】:Unable to deobfuscate GWT stacktrace无法对 GWT 堆栈跟踪进行反混淆
【发布时间】:2012-10-31 18:52:43
【问题描述】:

我们正在尝试将未捕获的 GWT 异常(我们使用 GWT 2.5 rc1)发送到我们的服务器以进行日志记录和调试。我们要对异常堆栈跟踪进行去混淆处理,否则它将毫无用处。

经过一番调查,我发现7 Tips for Exception Handling in GWTWebModeExceptions包含有价值的信息。

因此,我们创建了一个 GWT UncaughtExceptionHandler,它使用自定义 RPC 服务来传输异常及其堆栈跟踪。效果很好。

WebModeExceptions deobfuscation section 中所述,我们在 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 中描述的所需内容。

然后我们使用 -extra 参数编译 GWT 模块以获取符号映射。

我们的自定义日志服务使用 symbolMaps 目录来调用 com.google.gwt.logging.server.StackTraceDeobfuscator。我们使用 X-GWT-Permutation http 标头来调用反混淆器。我介入了反混淆方法以确保它可以加载符号图。它可能。我验证了使用的符号映射文件名与 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,得到了相同的结果。

【问题讨论】:

  • 出于好奇,有什么理由不使用RemoteLoggingServiceImpl
  • 我们已经标准化了客户端和服务器之间的所有通信是如何完成的(日志记录、安全性、错误处理),因此使用相同的机制向我们的服务器发送错误报告似乎是显而易见的选择。不过,我们使用 RemoteLoggingServiceImpl 源作为开发解决方案的模型。
  • @GuillaumeDuchesneau 也许你能帮我解决这个相关问题stackoverflow.com/questions/21655800/…
  • @GuillaumeDuchesneau 我目前正在实施相同的方案并偶然发现了您可能已经解决的问题。能否请您解释一下这个话题stackoverflow.com/questions/22049560/…提前非常感谢!
  • @GuillaumeDuchesneau 找到了我的问题的答案 - 请忽略我之前的评论

标签: java gwt


【解决方案1】:

经过进一步调查,我们使用的新 GWT 编译器选项-XenableClosureCompiler 生成的代码似乎不会输出使用编译器生成的符号映射的堆栈跟踪。删除该选项后,可以成功对堆栈跟踪进行反混淆。

附带说明一下,启用堆栈跟踪反混淆所需的编译器和 GWT 模块选项(我的问题中描述的那些并删除了闭包编译器选项)使我们的最终 js 文件比以前大了一倍。

【讨论】:

【解决方案2】:

问题中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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多