我正在调查以下内容 java.lang.VerifyError
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature: (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageRe˜̴Mt̴MÚw€mçw€mp:”MŒŒ
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
at java.lang.Class.getConstructor0(Class.java:2671)
Run Code Online (Sandbox Code Playgroud)
它在启动部署servlet的jboss服务器时发生.它是用jdk-1.5.0_11编译的,我试图用jdk-1.5.0_15重新编译它而没有成功.这是编译运行正常但在部署时,会发生java.lang.VerifyError.
当我更改方法名称并得到以下错误:
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: (IILjava/util/Collection;Lj ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageResources?á?ÿ?àN|?ÿ?àN?Üw?Çm?ºw?ÇmX#?ûM|X?öM
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357
at java.lang.Class.getConstructor0(Class.java:2671)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
Run Code Online (Sandbox Code Playgroud)
您可以看到显示更多的方法签名.
实际的方法签名是
private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
Collection calendarDays,
HashMap bcSpecialDays,
Collection activityPeriods,
Locale locale, MessageResources resources) throws Exception {
Run Code Online (Sandbox Code Playgroud)
我已经尝试过用它来查看它,javap并给出了应该的方法签名.
当我的其他同事检查代码,编译并部署它们时,它们会遇到同样的问题.当构建服务器获取代码并将其部署在开发或测试环境(HPUX)上时,会发生同样的错误.此外,运行Ubuntu的自动测试机在服务器启动期间显示相同的错误.
应用程序的其余部分运行正常,只有一个servlet出现故障.任何想看的地方都会有所帮助.
在我的Android应用程序中,我总是得到VerifyErrors!我无法弄清楚原因.每当我包含一个外部JAR时,我总是在尝试启动我的应用程序时获得VerifyErrors(除了一次,当我包含Apache Log4j时).
我通常通过获取库的源代码并将其添加到我的项目来解决这个问题,但我正在尝试放置GData客户端库.
我可以在源代码中获取它,但它的依赖项(mail.jar,activation.jar,servlet-api.jar)我不能,所以我得到验证错误.我想一劳永逸地找到这个问题的根源.我在互联网上看了一下,但他们似乎都在谈论不完整的类文件?我不知道.
当我在Linux(java 1.6.x)上将maven 3.0.3构建的webapp部署到tomcat 7.0.23并访问在登录页面中发布我的凭据时,我收到以下错误.pom.xml引用了servlet 2.5,jsp 2.1和JSTL 1.2.
为什么我会收到此错误?我该怎么做才能避免它?
我在同一个tomcat实例上部署了其他.war文件,并且从未在这些应用程序中遇到过这个问题.
我做了http GET的第一个JSP(login.jsp)没有抛出错误.从第一个JSP到第二个Jsp(ChLogin.jsp)的POST遇到了问题.
===========================
根本原因
java.lang.VerifyError: (class: org/apache/jsp/ChLogin_jsp, method: _jspService signature: (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Inconsistent stack height 0 != 1
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
java.lang.Class.getConstructor0(Class.java:2699)
java.lang.Class.newInstance0(Class.java:326)
java.lang.Class.newInstance(Class.java:308)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
Run Code Online (Sandbox Code Playgroud)
更新1
webapp的WEB-INF\lib不包含servlet,jsp或JSTL jar.它包含许多应用程序依赖项和spring jar(我们使用spring MVC).
更新2
我们不预编译JSP.不过,这是另一天的目标.
更新3
发现此问题不在tomcat 7.0.12,7.0.14,7.0.16中,而是从7.0.19开始.发布到tomcat用户邮件列表.得到一个答复,可能是日食JDT编译器有问题.通过用tomcat 7.0.16的JDT编译器和LO&BEHOLD替换tomcat 7.0.23/27中的编译器确实是这种情况,一切都很好.我打算写Eclipse JDT编译器团队(如果有的话)并发布有关此错误的信息.
在Android 1.6上部署我的应用程序时,我遇到了向后兼容性问题.我在这段代码上得到了VerifyError:
if(android.os.Build.VERSION.SDK_INT >= 11) {
getActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.actionbar_bg));
}
Run Code Online (Sandbox Code Playgroud)
这不是意料之外的,因为在API 11之前不存在getActionBar(),但1.6之后(API 5及更高版本?)根据在API级别上部署时获取的logcat消息进行半优雅的构建8装置;
06-27 16:47:04.333: INFO/dalvikvm(11529): Could not find method com.me.app.MyActivity.getActionBar, referenced from method com.me.app.MyActivity.init
06-27 16:47:04.333: WARN/dalvikvm(11529): VFY: unable to resolve virtual method 1090: Lcom.me.app.MyActivity;.getActionBar ()Landroid/app/ActionBar;
06-27 16:47:04.333: DEBUG/dalvikvm(11529): VFY: replacing opcode 0x6e at 0x004f
06-27 16:47:04.333: DEBUG/dalvikvm(11529): VFY: dead code 0x0052-005f in Lcom.me.app.MyActivity;.init (Z)V
Run Code Online (Sandbox Code Playgroud)
1.6及更早版本不会这样做,而是抛出VerifyError:
06-27 16:23:45.561: ERROR/dalvikvm(427): Could not find method com.me.app.MyActivity.getActionBar, referenced from method com.me.app.MyActivity.init
06-27 16:23:45.561: WARN/dalvikvm(427): VFY: unable to resolve virtual method 1090: Lcom/me/app/MyActivity;.getActionBar ()Landroid/app/ActionBar;
06-27 …Run Code Online (Sandbox Code Playgroud) android backwards-compatibility verifyerror android-3.0-honeycomb android-4.0-ice-cream-sandwich
我有以下父方法,在所有情况下都使用各种API级别:
public int setVoice (@NonNull final String language, @NonNull final String region){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return setVoice21(language, region);
} else {
return setVoiceDeprecated(language, region);
}
}
Run Code Online (Sandbox Code Playgroud)
并setVoice21做这样的事情:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int setVoice21 ( @NonNull final String language, @NonNull final String region){
try {
// try some API 21 stuff
} catch (final IllformedLocaleException e) {
e.printStackTrace();
return setVoiceDeprecated(language, region);
}
Run Code Online (Sandbox Code Playgroud)
setVoice21包含其他需要API 21+的代码,特别是TextToSpeech.Voice和Locale.Builder
当我在设备<API 21上运行此代码时,我收到以下错误:
W/dalvikvm:VFY:无法解析异常类6232(Ljava/util/IllformedLocaleException;)W/dalvikvm:VFY:拒绝操作码0x0d在0x0168 W/dalvikvm:VFY:拒绝Lcom/myapp/android/speech/MyTextToSpeech; .setVoice21 (Ljava/lang/String; Ljava/lang/String;)IW/dalvikvm:Verifier拒绝了类Lcom/myapp/android/speech/MyTextToSpeech;
E/AndroidRuntime:FATAL EXCEPTION:main java.lang.VerifyError:com/myapp/android/speech/MyTextToSpeech
如果我删除了 …
环境是Linux上的WAS 6.1,部署了一个使用xercesImpl.jar类的webapp.
由于公司政策限制,必须使用以下设置部署应用:
Class Loader Order
Classes loaded with parent class loader first
-> Classes loaded with application class loader first
WAR class loader policy
Class loader for each WAR file in application
-> Single class loader for application
Run Code Online (Sandbox Code Playgroud)
WAR文件包含xercesImpl.jar的副本,与编译应用程序时类路径中的相同.
启动webapp时,当Spring尝试解析其配置时,它会抛出:
java.lang.VerifyError: class loading constraint violated
(class: org/apache/xerces/jaxp/DocumentBuilderImpl
method: parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;)
Run Code Online (Sandbox Code Playgroud)
因此分析
看来WAS提供了org.apache.xerces.jaxp.DocumentBuilderImpl的实现,因为我们可以从WAR文件中删除xercesImpl.jar并仍然得到相同的错误(不是ClassNotFoundException).因此,WAS似乎使用自己的副本来解析引用,该副本与我们编译的类文件中的引用不兼容.但是,我能找到的'xercesImpl.jar'的唯一其他实例(除了使用我们的应用程序部署的副本)位于目录中
deploytool,这似乎在应用服务器之外.
我用WAS(所有1300个)扫描了所有的罐子
for i in `find . -name \*.jar`; do jar tvf $i|grep -qi xerces && echo $i ; done
Run Code Online (Sandbox Code Playgroud)
并发现它./java/jre/lib/xml.jar包含所有类org.apache.xerces.*,因此这可能是类加载器解析引用的地方.
这是肮脏的部分:
如果我们改为"父类加载器第一",我们看不到异常.这与预期的行为背道而驰.我们希望使用"application …
我从我的代码中收到以下错误:
尝试在堆栈上拆分long或double
我对这个错误的起源一无所知,也不知道如何调试它.这表明什么问题?我该如何解决?
[ERROR] [Mon May 23 14:29:46 IST 2011] [(class: org/apache/jsp/dashboard_jsp, method: _jspService signature: (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Attempt to split long or double on the stack] [10.97.34.222] hddlntdsz2350 [ session not set ]
java.lang.VerifyError: (class: org/apache/jsp/dashboard_jsp, method: _jspService signature: (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Attempt to split long or double on the stack
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.newInstance0(Class.java:326)
at java.lang.Class.newInstance(Class.java:308)
at org.jboss.web.tomcat.service.TomcatInjectionContainer.newInstance(TomcatInjectionContainer.java:273)
Run Code Online (Sandbox Code Playgroud)
问题代码:我创建了一个如下所示的模型
public class DashboardViewModel implements Serializable {
/** defalut serialization id */
private static final long serialVersionUID = 1L; …Run Code Online (Sandbox Code Playgroud) 我发现字节码VerifyErrors很难调试.JVM提供的反馈很少,通常只是当前类,有时是方法.
我通常通过ASM或Jasmin手动设计字节码时遇到的一些错误示例:
Stack size too largeUnable to pop operand off an empty stackFalling off the end of the codeExpecting to find object/array on stackIncompatible object argument for function callInconsistent stack height 4 != 2(要清楚;我知道所有这些意味着什么,我对调试它们的原因的工具或技术感兴趣.)
我的问题:是否有任何工具可以提供有关这些类型错误的详细反馈?我会欣赏诸如此类的信息
javap类似的输出自升级我的Android SDK以来,我的java.lang.VerifyError崩溃启动了以前正在运行的应用程序.
查看日志,导致崩溃的一些新问题以前不存在:
Could not find method android.support.v4.content.LocalBroadcastManager.getInstance, referenced from method com.myapp.android.App.setOAuthLoginState
04-12 19:43:10.249: W/dalvikvm(9508): VFY: unable to resolve static method 251: Landroid/support/v4/content/LocalBroadcastManager;.getInstance (Landroid/content/Context;)Landroid/support/v4/content/LocalBroadcastManager;
04-12 19:43:10.249: D/dalvikvm(9508): VFY: replacing opcode 0x71 at 0x0014
Run Code Online (Sandbox Code Playgroud)
android.support.v4.content.LocalBroadcastManager.getInstance似乎仍然在Android Compatibilty库的源代码中.在我的App.onCreate()被称为BTW之前记录此警告.
我已经尝试使用android-support-v4.jar以前使用我的应用程序的旧版本,以及android-support-v4.jar最新SDK 中包含的新版本,但结果在两种情况下都是相同的(这看起来很有趣吗?).
同样奇怪的是像这样的警告流:
W/dalvikvm(12455): VFY: unable to find class referenced in signature (Ltwitter4j/User;)
Run Code Online (Sandbox Code Playgroud)
这里引用的twitter4j库似乎在我的项目中正确包含.
我还在学习Java,所以我不确定导致这个问题的原因.任何帮助将不胜感激.
仅供参考,完整日志如下:
04-12 19:43:07.585: W/ActivityThread(9508): Application com.myapp.android is waiting for the debugger on port 8100...
04-12 19:43:07.593: I/System.out(9508): Sending WAIT chunk
04-12 19:43:07.601: I/dalvikvm(9508): …Run Code Online (Sandbox Code Playgroud) 当前版本的java(8u20,7u67)打破了gradle\groovy编译器和运行时兼容性:
:compileTestGroovy FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileTestGroovy'.
> Bad <init> method call from inside of a branch
Exception Details:
Location:
some/MyClass.<init>(Lsome/MyOtherClass;)V @71: invokespecial
Reason:
Error exists in the bytecode
Bytecode:
0x0000000: b800 174d 04bd 0019 5903 2b53 5910 ff12
0x0000010: 05b8 001f 2a5f ab00 0000 0055 0000 0003
0x0000020: f20b c677 0000 0022 0000 9b75 0000 0037
0x0000030: 2cce be6d 0000 0040 5f5a 5903 3212 05b8
0x0000040: 0023 c000 …Run Code Online (Sandbox Code Playgroud) verifyerror ×10
java ×8
android ×4
exception ×3
android-4.0-ice-cream-sandwich ×1
bytecode ×1
classloader ×1
debugging ×1
deployment ×1
gdata ×1
gradle ×1
groovy ×1
tomcat ×1
websphere ×1