gpt4 book ai didi

java - 为什么 Tomcat 无法显示实际的堆栈跟踪?

转载 作者:搜寻专家 更新时间:2023-11-01 01:22:49 24 4
gpt4 key购买 nike

使用 GWT,我已经将我的服务器部署到 Tomcat 中。这工作正常,但是当 GWT 抛出异常时,弹出窗口会向客户端显示异常的堆栈跟踪。

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

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

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)

在使用@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.java:395) Unknown.anonymous(XMLHttpRequest.java:287)

请帮忙!

最佳答案

在 GWT 文档中找到所有信息有点困难,您需要这些信息来设置去混淆的日志记录,所以这里是简短版本:

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

<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" />

在客户端,使用类似的东西

import java.util.logging.Logger;

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

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

在服务器端,配置RemoteLoggingServiceImpl。您必须告诉它在哪里找到符号映射,这将在使用 GWT 编译器参数 -extra /path/to/myExtraDir 编译时生成。 .我个人使用该方法覆盖 RemoteLoggingServiceImpl,以允许从 web.xml 的 <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);
}
}

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 , mymodulenamemypackage使用您自己的值,并且不要忘记使用 -extra argument 调用 GWT 编译器(请注意,您不必使用 -style PRETTY 或 DETAILED,它也适用于 OBF)。保留所有生成的 symbolMaps:没有它们,反混淆将无法工作。由于每个新版本都会自动获得一个唯一的名称,因此您可以在构建时将它们全部收集在一个安全的中心位置。

[*] 我真的非常想知道,为什么 RemoteLoggingServiceImpl 不自己实现它!

关于java - 为什么 Tomcat 无法显示实际的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11688587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com