java – GWT 2.6.1 SuperDevMode:堆栈跟踪不在服务器上进行反混淆
作者:互联网
直到今年5月,我正在使用GWT 2.5.1和简单的DevMode,并能够将带有堆栈跟踪的混淆异常发送到服务器,并使用符号映射对其进行反混淆,按照this brilliant article.这对我帮助很大.
从六月开始,我成功切换到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时,我省略了什么吗?
非常感谢您的任何帮助!
解决方法:
问题是每次重新编译时都会创建一个新的增量目录树(请参阅compile-1,compile-2 etc子目录).因此,运行应用程序服务器(托管servlet的服务器)将无法选择正确的compile-x / extras /< module-name> / symbolMaps目录,以便在调用setSymbolMapsDirectory时使用(如@Vadim指出的那样) ).当然,每次重新编译时,在预期的目录中复制这样的symbolMaps是一个相当的PITA(我甚至不确定它是否适用于wrt排列名称).
对于SuperDevMode时代初期的GWT-RPC来说,这是相同的,但不同之处在于代码服务器(SDM)现在直接暴露所有这些* .gwt.rpc输出文件,如果使用gwt.codeserver.port java标志,您的servlet将自动下载策略文件(仅在localhost中,并且GTW> = 2.5.1).
无论如何,重点是让代码服务器公开/提供symbolMaps文件(已经以某种方式,通过点击http:// localhost:9876 / sourcemaps /< module-name> /gwtSourceMap.json但仅适用于源图和不是以StackTraceCreator可理解的方式)以某种方式,如第一期中所描述的那样.
幸运的是,堆栈跟踪在开发中并不是那么糟糕.
标签:deobfuscation,gwt-super-dev-mode,java,gwt,stack-trace 来源: https://codeday.me/bug/20190830/1769773.html