2012-08-17 45 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更大,用戶應該可能看不到堆棧跟蹤。)

相關問題