【问题标题】:GWT 2.6.1 + SuperDevMode: stack traces are not deobfuscated on serverGWT 2.6.1 + SuperDevMode:堆栈跟踪未在服务器上进行反混淆
【发布时间】:2014-07-08 15:56:38
【问题描述】:

直到今年 5 月,我还在使用 GWT 2.5.1simple DevMode 并且能够发送带有堆栈跟踪的混淆异常根据this brilliant article 使用符号映射在那里服务器和去混淆它们。这对我帮助很大。

自 6 月起,我成功切换到 GWT 2.6.1SuperDevMode,与 simple DevMode 相比提供了相当不错的体验,并且使用起来更简单.

但是,我注意到我的堆栈跟踪不再在服务器上正确反混淆了。 即使在去混淆之后,我也会不断得到混淆的堆栈跟踪。

以下是*.gwt.xml文件的相关内容:

<module rename-to="somemodule">

    <!-- inherits, stylesheet, entry-point, source elements are going here -->

    <add-linker name="xsiframe" />

    <extend-property name="locale" values="uk" />
    <set-property-fallback name="locale" value="uk" />

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

    <set-property name="gwt.logging.logLevel" value="INFO" />            
    <set-property name="gwt.logging.enabled" value="TRUE" />  
    <set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />    
    <set-property name="gwt.logging.systemHandler" value="DISABLED" />  
    <set-property name="gwt.logging.popupHandler" value="DISABLED" />  
    <set-property name="gwt.logging.consoleHandler" value="ENABLED" />   
    <set-property name="gwt.logging.firebugHandler" value="ENABLED" />
</module>

以下是处理客户端异常的服务器端代码:

import static com.google.gwt.user.client.rpc.RpcRequestBuilder.STRONG_NAME_HEADER;
import com.google.gwt.core.client.impl.SerializableThrowable;
import com.google.gwt.logging.server.StackTraceDeobfuscator;

// ....

@Override
public void logClientException(final SerializableThrowable ex, final String userAgent, final String platform, final String moduleName) {
    final HttpServletRequest request = getThreadLocalRequest();

    final String symbolMapsDirectory = "webapps/" + getTomcatWebappFolder(request.getServletContext()) + "/WEB-INF/deploy/" + moduleName + "/symbolMaps";
    final String permutationName = request.getHeader(STRONG_NAME_HEADER);
    final Throwable original = new StackTraceDeobfuscator(symbolMapsDirectory).deobfuscateThrowable(ex.getThrowable(), permutationName);

    logClientException(original, userAgent, platform);
}

GWT 2.5.1 转移到 GWT 2.6.1 时我是否遗漏了什么?

非常感谢您的任何帮助!

【问题讨论】:

    标签: java gwt stack-trace deobfuscation gwt-super-dev-mode


    【解决方案1】:

    这是一个不幸的已知问题。请参阅herehere

    问题是每次重新编译都会创建一个全新的增量目录树(参见 compile-1、compile-2 等子目录)。因此,正在运行的应用程序服务器(托管您的 servlet)将无法选择正确的compile-x/extras/&lt;module-name&gt;/symbolMaps 目录以用于调用 setSymbolMapsDirectory(正如@Vadim 指出的那样)。当然,每次重新编译时在预期的目录中复制这样的symbolMaps 是一个相当不错的 PITA(我什至不确定它是否适用于排列名称)。

    这与 SuperDevMode 时代初期的 GWT-RPC 相同,但不同之处在于 codeserver (SDM) 现在直接公开所有这些 *.gwt.rpc 输出文件,如果 gwt.codeserver.port java 标志为使用时,您的 servlet 将自动下载策略文件(仅在 localhost 中,并且 GTW >= 2.5.1)。

    无论如何,关键是让代码服务器也以某种方式公开/提供symbolMaps 文件(通过点击http://localhost:9876/sourcemaps/&lt;module-name&gt;/gwtSourceMap.json,但仅针对源映射而不是以StackTraceCreator 可理解的方式) ,如第一期所述。

    幸运的是,堆栈跟踪并没有那么糟糕在开发过程中可以忍受。

    【讨论】:

    • 感谢您的回答!基本上我一天前自己得出了同样的结论,但没有机会写出类似的答案,因此接受你的!是的,我同意在开发过程中这不是一个大问题。让我们希望 GWT 团队能在不久的将来解决这个问题。
    【解决方案2】:

    就在昨天,我遇到了类似的问题。除了一个例外 - 我们在 GWT 日志记录中使用内置的反混淆功能。所以我的问题是不正确的symbolMapsDirectory 路径。这里的坏消息是 GWT 不会告诉您您的 symbolMaps 路径是否不正确:

    com.google.gwt.core.server.StackTraceDeobfuscator#loadSymbolMap:

    try {
      BufferedReader bin = ...
    } catch (IOException e) {
      // If the symbol map isn't found or there's an I/O error reading the file, the returned
      // mapping may contain some or all empty data (see below).
    }
    

    所以我们的工作解决方案如下所示:

    setSymbolMapsDirectory(getServletContext().getRealPath("/WEB-INF/deploy/" + moduleName + "/symbolMaps/"));
    

    【讨论】:

    • 感谢您的回答!但是您是否尝试在SuperDevMode(不是普通的DevMode 或生产模式)中使用这个反混淆器?因为在DevMode 或生产模式下一切正常,唯一的问题是SuperDevMode
    • 不,我没有尝试。在 SDM 中,您使用由 localhost:9876 托管的符号映射。但是 GWT 模块向 /remote_logger 发送请求到您的真实应用程序服务器。如果您不将 localhost:9876 中的 symbolMap 放到您的真实应用程序服务器中,/remote_logger 将无法对堆栈跟踪进行反混淆,因为缺少 symbolMap。我认为这是问题所在。
    • 是的,你是对的——我也得出了这个结论。让我们等到 GWT 团队为此发布解决方案 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多