2012-08-17 58 views
0

我有一个错误(可能是NPE)发生在我的GWT应用程序的客户端部分。而且只有在部署时才会发生。如何查看UmbrellaException的完整statcktrace(或根本原因)?

我得到的唯一消息是JS控制台中的UmbrellaException。没有堆栈跟踪,没有根本原因。

我不能用gwt插件在本地重现该错误,那会显示完整的堆栈跟踪。

所以我卡住了。

有没有什么办法:

  • 登录客户端与服务器异常?
  • 或者在js控制台中打印堆栈跟踪?

感谢

编辑:以供将来参考:如果已部署和未与GWT亚军时出现的错误,这是因为该bug涉及编译JS。在我的情况下,不正确的执行正则表达式。

+0

您必须先抓住并记录它。 https://developers.google。com/web-toolkit/doc/latest/DevGuideLogging – nullpotent 2012-08-17 08:36:40

+0

http://stackoverflow.com/questions/9578794/gwt-send-client-side-errors-stack-traces-to-server – Spiff 2012-08-17 08:45:04

+0

http://stackoverflow.com/问题/ 9444218/GWT-如何到写客户端 - 登录 - 进入 - 日志文件功能于GWT?RQ = 1 – Spiff 2012-08-17 08:47:19

回答

3

可以在远程服务器上使用GWT dev模式。启动配置必须包含“-noserver”开关以及正确的“-startupUrl”(对应于远程服务器)。您可以从本地浏览器访问它像往常一样:

http://my-remote-server/example?gwt.codesvr=127.0.0.1:9997 

注意的是,HTTP主机是远程服务器,但“gwt.codesvr”仍然指向到本地主机。这意味着应用程序将在“my-remote-server”中运行服务器端代码,但将使用本地Eclipse中的客户端代码,从而允许您对其进行调试。换句话说,URL中的“gwt.codesvr”告诉GWT浏览器插件从本地主机运行编译代码,而不是使用远程服务器上存在的已编译javascript代码。我发现这对于调试我无法在本地服务器中重现的客户端异常非常有用。

0

要捕获运行时异常,我使出了以下内容:

  1. 引入了一个故障排除GWT模块为我的应用程序,例如MyAppSnapshot.gwt.xml。在这里面我要求GWT编译器包括堆栈跟踪数据:

    <?xml version="1.0" encoding="UTF-8"?> 
    <module rename-to='client'> 
        <inherits name='com.teknoscan.aims.ui.MyAppBase' /> 
        <set-property name="compiler.stackMode" value="emulated" /> 
        <set-configuration-property name="compiler.emulatedStack.recordFileNames" value="true" /> 
    </module> 
    

    (。还有与上述性质的MyAppProduction.gwt.xml去除更多关于这些特性,请WebModeExceptions的意思)

  2. 介绍当我的应用程序出现GWT.UncaughtExceptionHandler()捕获运行时异常时显示的窗格。的helper方法解析,并设置堆栈跟踪,如果有文字:

    public void setThrowable(Throwable caught) { 
        if (!(caught == null || stackTraceTextArea == null)) { 
        if (caught.getStackTrace().length == 0) { 
         stackTraceTextArea.setText("No stack trace available."); 
        } else { 
         StringBuffer stb = new StringBuffer(); 
         stb.append(caught.getMessage() + "\n\nStack trace:\n"); 
         for (int i = 0; i < caught.getStackTrace().length; i++) { 
          stb.append(caught.getStackTrace()[i].toString() + "\n"); 
         } 
         stackTraceTextArea.setText(stb.toString()); 
        } 
        } 
    

    (有点重,但与编译器性能的结合给了我一个相当清晰的Java堆栈跟踪信息当然不是生产的基础之上。因为生成的JS更大,用户应该可能看不到堆栈跟踪。)

相关问题