Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法对GWT stacktrace进行除臭_Java_Gwt - Fatal编程技术网

Java 无法对GWT stacktrace进行除臭

Java 无法对GWT stacktrace进行除臭,java,gwt,Java,Gwt,我们正在尝试将未捕获的GWT异常(我们使用的是GWT2.5RC1)发送到服务器,以便进行日志记录和调试。我们希望清除异常堆栈跟踪,否则它将毫无用处 经过一些调查,我发现其中包含了有价值的信息 因此,我们创建了一个GWT UncaughtExceptionHandler,它使用自定义RPC服务传输异常及其堆栈跟踪。那很好 如中所述,我们在GWT模块中启用了stacktrace仿真: <set-property name="compiler.stackMode" value="emulated

我们正在尝试将未捕获的GWT异常(我们使用的是GWT2.5RC1)发送到服务器,以便进行日志记录和调试。我们希望清除异常堆栈跟踪,否则它将毫无用处

经过一些调查,我发现其中包含了有价值的信息

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

如中所述,我们在GWT模块中启用了stacktrace仿真:

<set-property name="compiler.stackMode" value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers"
    value="true" />
对我来说,它似乎没有问题,因为它包含了模糊的方法名和行号,正如中所述,行号似乎是所需的

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

我们的定制日志服务使用symbolMaps目录来调用com.google.gwt.logging.server.StackTraceDeobfuscator。我们使用X-GWT-Permutation http头来调用DeobFousator。我加入了deobfousate方法,以确保它可以加载符号映射。可以。我验证了使用的symbolMap文件名与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);
最终的结果是堆栈跟踪不会被除臭。有时,某些行会使用错误的类和方法名进行deobufset,但仅此而已。查看symbolMap文件时,堆栈跟踪中的实际符号与symbolMap文件中的任何符号都不匹配

知道我们做错了什么吗


编辑:我尝试了RemoteLoggingServiceImpl,得到了相同的结果。

进一步调查后,我们使用的新GWT编译器选项
-XenableClosureCompiler
生成的代码没有输出使用编译器生成的符号映射的堆栈跟踪。删除该选项后,可以成功地清除堆栈跟踪


作为补充说明,启用堆栈跟踪deobfousation所需的编译器和GWT模块选项(在我的问题和删除closure编译器选项中描述的选项)使我们的最终js文件比以前大了一倍。

问题中的
StackTraceDeobfuscator
版本现在已被弃用。这是一种新的方式(其实没什么不同):

仍然在.gwt.xml文件中设置属性:

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

出于好奇,您不使用的原因是什么?我们已经标准化了客户端和服务器之间的所有通信方式(日志记录、安全性、错误处理),因此使用相同的机制向服务器发送错误报告似乎是一个明显的选择。我们使用RemoteLoggingServiceImpl源代码作为开发解决方案的模型。@GuillaumeDuchesneau可能是您可以帮助我解决这个相关问题@GuillaumeDuchesneau我目前正在实施相同的方案,偶然发现了您可能已经解决的问题。你能解释一下这个话题吗?非常感谢@GuillaumeDuchesneau找到了我问题的答案-请忽略我之前的评论这已被接受为GWT第7803期()@RoyPaterson该期已移至Github()。它也于2016年2月22日关闭,并发表以下评论:“实验性关闭编译器集成已从GWT 2.8中删除,因此关闭此问题。”
<set-property name="compiler.stackMode" value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers" value="true" />
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);