利用Arthas排查NoSuchMethodError

1、前言

有时spring boot应用会遇到java.lang.NoSuchMethodError的问题,下面以具体的demo来说明怎样利用arthas来排查。

Demo: https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-NoSuchMethodError

2、在应用的main函数里catch住异常,保证进程不退出

很多时候当应用抛出异常后,进程退出了,就比较难排查问题。可以先改下main函数,把异常catch住:

public static void main(String[] args) throws IOException {try {SpringApplication.run(DemoNoSuchMethodErrorApplication.class, args);} catch (Throwable e) {e.printStackTrace();}// blockSystem.in.read();}

Demo启动之后,抛出的异常是:

java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)Vat org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:394)at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:383)at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:249)at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:225)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)at com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication.main(DemoNoSuchMethodErrorApplication.java:13)

显然,异常的意思是AnnotationAwareOrderComparator缺少sort(Ljava/util/List;)V这个函数。

3、安装arthas

参考:https://alibaba.github.io/arthas/install-detail.html

使用sc命令查找类所在的jar包
应用需要抛出了异常,但是进程还没有退出,我们用arthas来attach上去。比如在mac下面:

./as.sh

然后选择com.example.demoNoSuchMethodError.DemoNoSuchMethodErrorApplication进程。

再执行sc命令来查找类:

$ sc -d org.springframework.core.annotation.AnnotationAwareOrderComparatorclass-info        org.springframework.core.annotation.AnnotationAwareOrderComparatorcode-source       /Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jarname              org.springframework.core.annotation.AnnotationAwareOrderComparatorisInterface       falseisAnnotation      falseisEnum            falseisAnonymousClass  falseisArray           falseisLocalClass      falseisMemberClass     falseisPrimitive       falseisSynthetic       falsesimple-name       AnnotationAwareOrderComparatormodifier          publicannotationinterfacessuper-class       +-org.springframework.core.OrderComparator+-java.lang.Objectclass-loader      +-sun.misc.Launcher$AppClassLoader@5c647e05+-sun.misc.Launcher$ExtClassLoader@689e3d07classLoaderHash   5c647e05Affect(row-cnt:1) cost in 41 ms.

可以看到AnnotationAwareOrderComparator是从spring-2.5.6.SEC03.jar里加载的。

4、使用jad查看反编绎的源代码

下面使用jad命令来查看AnnotationAwareOrderComparator的源代码

$ jad org.springframework.core.annotation.AnnotationAwareOrderComparatorClassLoader:
+-sun.misc.Launcher$AppClassLoader@5c647e05+-sun.misc.Launcher$ExtClassLoader@689e3d07Location:
/Users/hengyunabc/.m2/repository/org/springframework/spring/2.5.6.SEC03/spring-2.5.6.SEC03.jar/** Decompiled with CFR 0_132.*/
package org.springframework.core.annotation;import java.lang.annotation.Annotation;
import org.springframework.core.OrderComparator;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;public class AnnotationAwareOrderComparator
extends OrderComparator {protected int getOrder(Object obj) {Order order;if (obj instanceof Ordered) {return ((Ordered)obj).getOrder();}if (obj != null && (order = obj.getClass().getAnnotation(Order.class)) != null) {return order.value();}return Integer.MAX_VALUE;}
}Affect(row-cnt:1) cost in 286 ms.

可见,AnnotationAwareOrderComparator的确没有sort(Ljava/util/List;)V函数。

5、排掉依赖,解决问题

从上面的排查里,可以确定

  • AnnotationAwareOrderComparator来自spring-2.5.6.SEC03.jar,的确没有sort(Ljava/util/List;)V函数。

所以,可以检查maven依赖,把spring 2的jar包排掉,这样子就可以解决问题了。

6、总结

  • 仔细看NoSuchMethodError的异常信息,了解是什么类缺少了什么函数
  • 利用arthas来查找类,反编绎源码,确认问题

本文主要注重思路。很多时候,本地开发与服务器上可能存在差异,本地问题容易debug,远程的虽然也可以远程debug,但是毕竟没有本地方便。所以,借助工具(如:Arthas)会更容易分析服务器上的问题。

本文主要参考:https://yq.aliyun.com/articles/645679?utm_content=m_1000017531

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

感谢有你们,架构师修行之路!

感谢有你们转眼马上就十月一了&#xff0c;听说今年的阵势非常强大&#xff0c;菜菜虽然身在北京&#xff0c;但是可能也目睹不了这个激动时刻了。自从2018年年底决定开始写公众号以来&#xff0c;几乎每个周末都在构思文章&#xff0c;撰写文章。关注公众号的老粉丝应该知道&a…

自定义构建基于.net core 的基础镜像

先说一个问题首先记录一个问题&#xff0c;今天在用 Jenkins 构建项目的时候突然出现包源的错误&#xff1a;/usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): error : Unable to load the service index for source https: /usr/share/dotnet/sdk/2.2.104/NuGet.targets(…

操作系统——缓冲区溢出

一、缓冲区溢出介绍 1988年&#xff0c;世界上第一个缓冲区溢出攻击–Morris蠕虫在互联网上泛滥&#xff0c;短短一夜的时间全世界6000多台网络服务器瘫痪或半瘫痪&#xff0c;不计其数的数据和资料被毁。造成一场损失近亿美元的空前大劫难&#xff01; 那么&#xff0c;缓冲…

从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书

宫哈喽大家好&#xff0c;国庆马上就要来了&#xff0c;在新的第四季度来临之际&#xff0c;祝大家年末能顺顺利利&#xff0c;解决所有的难题。大家可能从我的标题里也能看的出来&#xff0c;老张又要耍花样&#xff0c;搞事情了&#xff0c;近来随着 netcore 3.0 的正式推出&…

操作系统——内存管理——分段和分页

一、 物理地址和逻辑地址 物理地址&#xff1a;加载到内存地址寄存器中的地址&#xff0c;内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址&#xff0c;编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地…

Kubernetes攻略之新手上路

在公有云、私有云和混合云的环境中&#xff0c;Kubernetes已经成为规模化部署容器应用的事实标准。最大的公有云平台AWS、谷歌云、Azure、IBM云和Oracle云目前都提供Kubernetes的管理服务&#xff08;Managed Services&#xff09;。各大互联网公司也开始将服务部署到Kubernete…

操作系统——深入理解虚拟内存机制

本文来自&#xff1a;https://www.jianshu.com/p/13e337312651 概述 现代操作系统了提供了一种对主存的抽象概念&#xff0c;叫做虚拟内存。它为每个进程提供了一个非常大的&#xff0c;一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力&#xff1a; 它为所有进程提…

dotNET Core 中怎样操作 AD?

做企业应用开发难免会跟 AD 打交道&#xff0c;在之前的 dotNET FrameWork 时代&#xff0c;通常使用 System.DirectoryServices 的相关类来操作 AD &#xff0c;在 dotNET Core 中没有这个命名空间&#xff0c;在张善友大佬的推荐下&#xff0c;知道了 Novell.Directory.Ldap。…

操作系统——页面置换算法

一、页面置换算法简介 操作系统将内存按照页的进行管理&#xff0c;在需要的时候才把进程相应的部分调入内存。当产生缺页中断时&#xff0c;需要选择一个页面写入。如果要换出的页面在内存中被修改过&#xff0c;变成了“脏”页面&#xff0c;那就需要先写会到磁盘。页面置换…

在树莓派4上安装 .NET Core 3.0 运行时及 SDK

点击上方蓝字关注“汪宇杰博客”导语我最近买了个树莓派4&#xff0c;4GB内存高富帅配置&#xff0c;并安装了官方操作系统Raspbian。今天我成功运行了一个ASP.NET Core 3.0 应用程序。我们来看看怎么弄的吧~ARM32 还是 ARM64?需要说明的是&#xff0c;目前无法在树莓派 4 上运…

.NET生成漂亮桌面背景

前言一天&#xff0c;我朋友指着某某付费软件对我说&#xff0c;这个东西不错&#xff0c;每天生成一张桌面背景&#xff0c;还能学英语&#xff08;放置名人名言和翻译&#xff09;&#xff01;我说&#xff0c;这东西搞不好我也能做&#xff0c;然后朋友说&#xff0c;“如果…

Mysql 执行流程

mysql执行一个查询的过程&#xff0c;到底做了些什么&#xff1a; 客户端发送一条查询给服务器&#xff1b;服务器先检查查询缓存&#xff0c;如果命中了缓存&#xff0c;则立刻返回存储在缓存中的结果。否则进入下一阶段。服务器段进行SQL解析、预处理&#xff0c;在优化器生成…

Autofac的AOP面向切面编程研究

我的理解是 把系统性的编程工作封装起来 》我给这个取个名字叫 “Aspect”&#xff0c;然后通过AOP技术把它切进我们的业务逻辑代码 》 “业务“这样的好处&#xff1a;“Aspect” 和 “业务” 相互独立&#xff0c;既可以让“业务” 用到了 “Aspect” 又让2者互相独立不耦合&…

计算机网络原理梳理丨清晰认识 TCP/IP 协议,图解秒懂!

作者&#xff1a;MobMsg&#xff0c;资深全端工程师一枚&#xff0c;架构师社区合伙人&#xff01;TCP/IP 协议族Internet 的核心协议就是 TCP/IP&#xff0c;广泛应用于局域网和广域网&#xff0c;目前已有20年发展史&#xff0c;是现用国际通行标准。TCP/IP 是个协议族&#…

MySQL 覆盖索引、最左前缀原则、索引下推

1、覆盖索引 1.1 概念 索引是高效找到行的一个方法&#xff0c;当能通过检索索引就可以读取想要的数据&#xff0c;那就不需要再到数据表中读取行了。如果一个索引包含了&#xff08;或覆盖了&#xff09;满足查询语句中字段与条件的数据就叫做覆盖索引。 1.2 判断标准 使用…

Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令

在使用Entity Framework Core生成MySQL数据库脚本&#xff0c;对于生成的存储过程&#xff0c;在执行的过程中出现错误&#xff0c;需要在存储过程前面添加delimiter //附&#xff1a;可以使用Visual Studio中的程序包管理器控制台执行Entity Framework Core中的迁移命令。PMC …

Exceptionless 5.0.0本地Docker快速部署介绍

在之前我有专门写两篇文章介绍过Exceptionless这款开源日志项目的使用和部署&#xff0c;但是当时是基于4.1.0版本&#xff08;2017年的release&#xff09;&#xff0c;时隔两年多Exceptionless也推出了5.0.0版本。&#xff08;1&#xff09;&#xff08;2&#xff09;01—关于…

数据库事务及隔离级别

一、事务的基本要素&#xff08;ACID&#xff09; 1、原子性&#xff08;Atomicity&#xff09;&#xff1a;事务开始后所有操作&#xff0c;要么全部做完&#xff0c;要么全部不做&#xff0c;不可能停滞在中间环节。事务执行过程中出错&#xff0c;会回滚到事务开始前的状态…

定了!10 月 8 日!Jupyter Notebook 原生支持将正式来到 VS Code!

北京时间 2019 年 9 月 21 日&#xff0c;在 PyCon China 2019 大会上&#xff0c;前不久&#xff0c;我们已经可以尽管如此&#xff0c;还是有许多童鞋来询问这个功能何时能正式发布。现在&#xff0c;我们可以在 VS Code Python 插件的 Release Plan 看到正式的发布时间已经确…

图解MySQL 内连接、左连接、右连接

一、准备工作 用两个表&#xff08;a_table、b_table&#xff09;&#xff0c;关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接、外连接&#xff08; 左(外)连接、右(外)连接、全(外)连接&#xff09;。 MySQL版本&#xff1a;Server version: 5.6.31 MySQL Comm…