java – 无法消除GWT堆栈跟踪

我们正在尝试将未经考虑的GWT异常(我们使用GWT 2.5 rc1)发送到我们的服务器进行日志和调试.我们想要混淆异常堆栈跟踪,否则这将几乎没用.

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

所以我们创建了一个GWT UncaughtExceptionHandler,它使用自定义的RPC服务来传递异常和它们的堆栈跟踪.工作正常

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

<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头来调用解扰器.我采取了去混淆的方法,以确保它可以加载符号图.它可以.我验证了使用的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);

最终的结果是堆栈跟踪不会被消除.有时候,一些行将被错误的类和方法名称解开,但没有更多.查看symbolMap文件时,堆栈跟踪中的实际符号与symbolMap文件中的任何符号不匹配.

任何想法我们在这里做错什么?

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

最佳答案
进一步调查后,我们使用的新的GWT编译器选项-XenableClosureCompiler似乎生成了不输出使用编译器生成的符号映射的堆栈跟踪的代码.删除该选项后,堆栈跟踪可以被成功的消除模糊.

作为附注,编译器和GWT模块选项需要启用堆栈跟踪去混淆(在我的问题中描述并删除闭包编译器选项)使我们的最终js文件比以前大两倍.

转载注明原文:java – 无法消除GWT堆栈跟踪 - 代码日志