为什么Tomcat无法显示实际的堆栈跟踪? [英] Why is Tomcat unable to show the actual stack trace?

查看:166
本文介绍了为什么Tomcat无法显示实际的堆栈跟踪?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 GWT ,我已将服务器部署到 Tomcat 中。这工作正常,但是当 GWT 引发异常时,Popup向客户端显示异常的堆栈跟踪。

在开发模式下,这工作正常。在Tomcat中,我得到了下面的堆栈跟踪。



为什么以及如何解决这个问题?

$ b


  Unknown.Le(StackTraceCreator.java:168)
Unknown.Jd(StackTraceCreator.java:421)
未知.NT(Exception_FieldSerializer.java:16)
Unknown.g1(SerializerBase.java:55)
Unknown.b1(SerializerBase.java:112)
Unknown.D $(AbstractSerializationStreamReader.java:
Unknown.uAc(CustomException_FieldSerializer.java:39)
Unknown.uBc(ServerSideException_FieldSerializer.java:12)
Unknown.f1(SerializerBase.java:46)
未知。 _0(SerializerBase.java:92)
Unknown.D $(AbstractSerializationStreamReader.java:119)
Unknown.B_(RequestCallbackAdapter.java:216)
Unknown._o(Request.java:287 )


使用@Christian Kuetbach的答案后,我现在得到的:


Unknown.com_google_gwt_core_client_impl_StackTraceCreator $ CollectorEmulated_ $ fillInStackTrace__Lcom_google_gwt_core_client_impl_StackTraceCreator $ CollectorEmulated_2Ljava_lang_Throwable_2V(StackTraceCreator.java:168)
Unknown.java_lang_Throwable_Throwable__Ljava_lang_String_2Ljava_lang_Throwable_2V(StackTraceCreator.java:421)
Unknown.com_google_gwt_user_client_rpc_StatusCodeException_StatusCodeException__ILjava_lang_String_2V(StatusCodeException.java:35)
$ Unknown.com_google_gwt_user_client_rpc_impl_RequestCallbackAdapter_ onResponseReceived__Lcom_google_gwt_user_client_rpc_impl_RequestCallbackAdapter_2Lcom_google_gwt_http_client_Request_2Lcom_google_gwt_http_client_Response_2V (RequestCallbackAdapter.java:209)
$ Unknown.com_google_gwt_http_client_Request_ fireOnResponseReceived__Lcom_google_gwt_http_client_Request_2Lcom_google_gwt_http_client_RequestCallback_2V(Request.java:287)
$ Unknown.com_google_gwt_http_client_RequestBuilder 1_onReadyStateChange__Lcom_google_gwt_xhr_client_XMLHttpRequest_2V(RequestBuilder.jav a:395)Unknown.anonymous(XMLHttpRequest.java:287)


请帮助!

解决方案

在GWT文档中找到所有需要设置去混淆记录的信息有点困难,版本:



在您的模块文件(.gwt.xml)中,添加:

 < inherits name =com.google.gwt.logging.Logging/> 
< set-property name =gwt.logging.simpleRemoteHandlervalue =ENABLED/>
< set-configuration-property name =compiler.emulatedStack.recordLineNumbers
value =true/>

在客户端,使用类似于

< pre class =lang-java prettyprint-override> import java.util.logging.Logger;

private static Logger rootLogger = Logger.getLogger();
...
rootLogger.log(Level.SEVERE,我的信息,e);

您不必创建 RemoteLoggingServiceAsync 实例在客户端 - 由记录器自动使用,因为我们指定了< set-property name =gwt.logging.simpleRemoteHandlervalue =ENABLED/>



在服务器端,配置RemoteLoggingServiceImpl。您必须告诉它,它在哪里找到symbolMaps,它将在编译GWT编译器参数 -extra / path / to / myExtraDir 时生成。我个人使用该方法来覆盖RemoteLoggingServiceImpl,以允许从web.xml的< init-param> s [*] p>

  package mypackage.server; 

public class ConfigurableRemoteLoggingServiceImpl extends RemoteLoggingServiceImpl {
$ b @Override
public void init(final ServletConfig config)throws ServletException {
super.init(config);

最终字符串symbolMapsDirectory =
config.getInitParameter(symbolMapsDirectory);
setSymbolMapsDirectory(symbolMapsDirectory);




$ web.xml ,注册它像


 < servlet> 
< servlet-name> remoteLogging< / servlet-name>
< servlet-class> mypackage.server.ConfigurableRemoteLoggingServiceImpl< / servlet-class>

< init-param>
< param-name> symbolMapsDirectory< / param-name>
< param-value> / path / to / myExtraDir / mymodulename / symbolMaps< / param-value>
< / init-param>
< / servlet>
< servlet-mapping>
< servlet-name> remoteLogging< / servlet-name>
< url-pattern> / mymodulename / remote_logging< / url-pattern>
< / servlet-mapping>

替换 / path / to / myExtraDir mymodulename mypackage 用你自己的值,并且不要忘记用 -extra 参数(注意,你不用不必使用 -style PRETTY 或Detailed,它也适用于OBF)。保留所有生成的符号映射:没有它们,反混淆将不起作用。由于每个新版本都会自动获取唯一的名称,因此您可以在构建时将其收集在一个安全的中心位置。

,为什么RemoteLoggingServiceImpl本身没有实现!


Using GWT, I have deployed my server into Tomcat. This works fine, but when GWT throws an exception, a Popup shows the client the stack trace of the exception.

In dev mode, this works fine. In Tomcat, I get the below stack trace.

Why and how do you fix this?

Unknown.Le(StackTraceCreator.java:168)
Unknown.Jd(StackTraceCreator.java:421)
Unknown.NT(Exception_FieldSerializer.java:16)
Unknown.g1(SerializerBase.java:55)
Unknown.b1(SerializerBase.java:112)
Unknown.D$(AbstractSerializationStreamReader.java:119)
Unknown.uAc(CustomException_FieldSerializer.java:39)
Unknown.uBc(ServerSideException_FieldSerializer.java:12)
Unknown.f1(SerializerBase.java:46)
Unknown._0(SerializerBase.java:92)
Unknown.D$(AbstractSerializationStreamReader.java:119)
Unknown.B_(RequestCallbackAdapter.java:216)
Unknown._o(Request.java:287)

After using @Christian Kuetbach's answer, here is what I get now:

Unknown.com_google_gwt_core_client_impl_StackTraceCreator$CollectorEmulated_$fillInStackTrace__Lcom_google_gwt_core_client_impl_StackTraceCreator$CollectorEmulated_2Ljava_lang_Throwable_2V(StackTraceCreator.java:168) Unknown.java_lang_Throwable_Throwable__Ljava_lang_String_2Ljava_lang_Throwable_2V(StackTraceCreator.java:421) Unknown.com_google_gwt_user_client_rpc_StatusCodeException_StatusCodeException__ILjava_lang_String_2V(StatusCodeException.java:35) Unknown.com_google_gwt_user_client_rpc_impl_RequestCallbackAdapter_$onResponseReceived__Lcom_google_gwt_user_client_rpc_impl_RequestCallbackAdapter_2Lcom_google_gwt_http_client_Request_2Lcom_google_gwt_http_client_Response_2V(RequestCallbackAdapter.java:209) Unknown.com_google_gwt_http_client_Request_$fireOnResponseReceived__Lcom_google_gwt_http_client_Request_2Lcom_google_gwt_http_client_RequestCallback_2V(Request.java:287) Unknown.com_google_gwt_http_client_RequestBuilder$1_onReadyStateChange__Lcom_google_gwt_xhr_client_XMLHttpRequest_2V(RequestBuilder.java:395) Unknown.anonymous(XMLHttpRequest.java:287)

Please Help!

解决方案

It's a bit difficult to find all the information in the GWT docs, which you need to setup de-obfuscated logging, so here's the short version:

In your module file (.gwt.xml), add:

<inherits name="com.google.gwt.logging.Logging"/>
<set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
<set-property name="compiler.stackMode" value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers" 
     value="true" />

On the client side, use something like

import java.util.logging.Logger;

private static Logger rootLogger = Logger.getLogger("");
...
rootLogger.log(Level.SEVERE, "My message", e);

You don't have to create a RemoteLoggingServiceAsync instance on the client side - it's used automatically by the logger, because we specified <set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />.

On the server side, configure the RemoteLoggingServiceImpl. You will have to tell it, where it finds the symbolMaps, which will be generated when compiling with the GWT compiler argument -extra /path/to/myExtraDir. I personally use the approach to override RemoteLoggingServiceImpl, to allow specifying the directory from web.xml's <init-param>s [*]

package mypackage.server;

public class ConfigurableRemoteLoggingServiceImpl extends RemoteLoggingServiceImpl {

  @Override
  public void init(final ServletConfig config) throws ServletException {
    super.init(config);

    final String symbolMapsDirectory = 
        config.getInitParameter("symbolMapsDirectory");
    setSymbolMapsDirectory(symbolMapsDirectory);
  }
}

In web.xml, register it like

<servlet>
    <servlet-name>remoteLogging</servlet-name>
    <servlet-class>mypackage.server.ConfigurableRemoteLoggingServiceImpl</servlet-class>

  <init-param>
    <param-name>symbolMapsDirectory</param-name>
    <param-value>/path/to/myExtraDir/mymodulename/symbolMaps</param-value>
  </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>remoteLogging</servlet-name>
    <url-pattern>/mymodulename/remote_logging</url-pattern>
</servlet-mapping>

Replace /path/to/myExtraDir, mymodulename and mypackage with your own values, and don't forget to call the GWT compiler with the -extra argument (Note that you you don't have to use -style PRETTY or DETAILED, it also works with OBF). Keep all generated symbolMaps: Without them, deobfuscation will not work. As every new version gets a unique name automatically, you can collect them all in a safe central place when building.

[*] And I really, really wonder, why RemoteLoggingServiceImpl doesn't implement that itself!

这篇关于为什么Tomcat无法显示实际的堆栈跟踪?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆