GWT 2.6.1 + SuperDevMode:堆栈跟踪不在服务器上进行反混淆处理

时间:2014-07-08 15:56:39

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

到今年5月,我正在使用 GWT 2.5.1 简单的DevMode ,并能够发送带有堆栈跟踪的模糊异常<根据{{​​3}}使用符号地图强大地>服务器并对其进行反混淆。这对我帮助很大。

自6月份以来,我成功切换到 GWT 2.6.1 SuperDevMode ,与简单的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 时,我是否省略了某些内容?

非常感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:3)

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

问题是每次重新编译时都会创建一个新的增量目录树(请参阅compile-1,compile-2 etc子目录)。因此,运行应用程序服务器(托管servlet的服务器)将无法获取正确的compile-x/extras/<module-name>/symbolMaps目录,以便在调用setSymbolMapsDirectory时使用(如@Vadim指出的那样)。当然,每次重新编译时,在预期的目录中复制这样的symbolMaps是一个非常的PITA(而且我甚至不确定它是否适用于排列名称)。

在SuperDevMode时代开始时GWT-RPC的情况相同,但不同的是,代码服务器(SDM)现在直接暴露所有* .gwt.rpc输出文件,如果{{1}使用java标志,您的servlet将自动下载策略文件(仅在localhost中,并且GTW&gt; = 2.5.1)。

无论如何,重点是让代码服务器公开/提供gwt.codeserver.port文件(通过点击symbolMaps已经以某种方式实现了这一点,但仅针对源图而不是http://localhost:9876/sourcemaps/<module-name>/gwtSourceMap.json可以理解的方式),正如第一期中所描述的那样。

幸运的是,堆栈跟踪在开发过程中不会那么糟糕

答案 1 :(得分: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/"));