日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用Arthas排查NoSuchMethodError

發布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用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

總結

以上是生活随笔為你收集整理的利用Arthas排查NoSuchMethodError的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。