精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 Arthas 排查開源 Excel 組件問題

開發
JVMTI(JVM Tool Interface):是 JVM 暴露出來的一些供用戶擴展的接口集合,JVMTI 是基于事件驅動的,JVM 每執行到一定的邏輯就會調用一些事件的回調接口(如果有的話),這些接口可以供開發者去擴展自己的邏輯。

 [[408346]]

背景介紹

項目中有使用到 com.github.dreamroute excel-helper 這個工具來輔助 Excel 文件的解析,出錯時的代碼是這樣寫的:如下所示(非源代碼)

  1. try { excelDTOS = ExcelHelper.importFromFile(ExcelType.XLSX, file, ExcelDTO.class); } catch (Exception e) { log.error("ExcelHelper importFromFile exception msg {}", e.getMessage()); } 

因為打印異常信息時,使用了 e.getMessage() 方法,沒有將異常信息打印出來。而且本地復現也沒有復現出來。所以只能考慮使用 arthas 來協助排查這個問題了。

排查過程

1、線上服務器安裝 Arthas。
https://arthas.aliyun.com/doc/install-detail.html

2、使用 watch 命令監控指定方法,打印出異常的堆棧信息,命令如下:

watch com.github.dreamroute.excel.helper.ExcelHelper importFromFile '{params,throwExp}' -e -x 3
再次調用方法,捕獲到異常棧信息如下:

已經捕獲到異常,并打印出堆棧信息。

3、根據對應的堆棧信息,定位到具體的代碼,如下:

代碼很簡單,從代碼中可以很清晰的看到如果沒有從 headerInfoMap 中沒有獲取到指定的 headerInfo ,就會拋這個異常。沒有找到只有兩種情況:

headerInfoMap 中保存的信息不對。

cell 中的 columnIndex 超出的正常的范圍導致沒有獲取到對應 HeaderInfo 。
對于第二種情況,首先去校驗了一下上傳的 Excel 文件是否有問題,本地測試了一下 Excel 文件,沒有任何問題。本地測試也是成功的,所以主觀判斷,第二種情況的可能性不大。

所以說主要檢查第一種情況是否發生,這個時候可以再去看一下該方法的第一行代碼

  1. MapheaderInfoMap = processHeaderInfo(rows,cls); 

可以看到headerInfoMap是通過processHeaderInfo中獲取的。找到processHeaderInfo 的代碼,如下所示。

  1. public static MapproceeHeaderInfo(Iteratorrows, Class cls) { if (rows.hasNext()) { Row header = rows.next(); return CacheFactory.findHeaderInfo(cls, header); } return new HashMap<>(0);}public static MapfindHeaderInfo(Class cls, Row header) { MapheaderInfo = HEADER_INFO.get(cls); if (MapUtils.isEmpty(headerInfo)) { headerInfo = ClassAssistant.getHeaderInfo(cls, header); HEADER_INFO.put(cls, headerInfo); } return headerInfo;}public static MapgetHeaderInfo(Class cls, Row header) { IteratorcellIterator = header.cellIterator(); Listfields = ClassAssistant.getAllFields(cls); MapheaderInfo = new HashMap<>(fields.size()); while (cellIterator.hasNext()) { org.apache.poi.ss.usermodel.Cell cell = cellIterator.next(); String headerName = cell.getStringCellValue(); for (Field field : fields) { Column col = field.getAnnotation(Column.class); String name = col.name(); if (Objects.equals(headerName, name)) { HeaderInfo hi = new HeaderInfo(col.cellType(), field); headerInfo.put(cell.getColumnIndex(), hi); break; } } } return headerInfo;} 

主要通過 CacheFactory 類的 findHeaderInfo 來生成,在 findHeaderInfo 方法中,通過一個被 static final 修飾的 HEADER_INFO 變量來做緩存,被調用時先去HEADER_INFO 中查,如果有則直接返回,沒有則重新創建(也就說明相同的 Excel 文件,僅初始化一次 HeaderInfo )。創建的步驟在 ClassAssistant.getHeaderInfo() 方法中。

簡單的看一下 HeaderInfo 的生成過程,根據 Excel 文件的第一行中的各個 Cell 值與自定義實體類的注解比較,如果名字相同,就存為一個鍵值對( HeaderInfo 的數據結構為 HashMap )。

4、這個時候需要再確認一下 HEADER_INFO 中保存的 ExcelDTO.class 相關的 HeaderInfo 是怎樣的。通過 ognl 命令或者 getstatic 命令來查看。這里使用 ognl 命令。

  1. ognl '#value=new com.tom.dto.ExcelDTO(),#valueMap=@com.github.dreamroute.excel.helper.cache.CacheFactory@HEADER_INFO,#valueMap.get(#value.getClass()).entrySet().iterator.{#this.value.name}' 

結果如下:正常情況下這個 Excel 文件有 6 列信息,為什么只產生了 4 個鍵值對呢?如果 HEADER_INFO 中保存了錯的,從上面的邏輯來看,后面上傳的正確的 Excel 文件在解析時都會拋錯。

5、詢問了當時發現這個問題的同事,得知他第一次上傳的 Excel 文件是有問題的,后面想改正,再上傳時便出現了問題。到這里問題也算是找到了。

Arthas 原理探究

有了實際的使用之后,不免會想到,Arthas 是如何做到在程序運行時,動態監測我們的代碼的呢?帶著這樣的問題,我們一起來看下 Java Agent 技術實現原理。

Java Agent 技術

Agent 是一個運行在目標 JVM 的特定程序,它的職責是負責從目標 JVM 中獲取數據,然后將數據傳遞給外部進程。加載 Agent 的時機可以是目標 JVM 啟動之時,也可以是在目標 JVM 運行時進行加載,而在目標 JVM 運行時進行 Agent 加載具備動態性。

基礎概念

JVMTI(JVM Tool Interface):是 JVM 暴露出來的一些供用戶擴展的接口集合,JVMTI 是基于事件驅動的,JVM 每執行到一定的邏輯就會調用一些事件的回調接口(如果有的話),這些接口可以供開發者去擴展自己的邏輯。
JVMTIAgent(JVM Tool Interface):是一個動態庫,利用 JVMTI 暴露出來的一些接口幫助我們在程序啟動時或程序運行時 JVM Attach 機制,將 Agent 加載到目標 JVM 中。
JPLISAgent(Java Programming Language Instrumentation Services Agent):它的作用是初始化所有通過 Java Instrumentation API 編寫的 Agent,并且也承擔著通過 JVMTI 實現 Java Instrumentation 中暴露 API 的責任。
VirtualMachine :提供了Attach 動作和 Detach 動作,允許我們通過 attach 方法,遠程連接到 JVM 上,然后通過 loadAgent 方法向 JVM 注冊一個代理程序 agent ,在該 agent 的代理程序中會得到一個 Instrumentation 實例,該實例可以在 class 加載前改變 class 的字節碼,也可以在 class 加載后重新加載。
Instrumentation:可以在 class 加載前改變 class 的字節碼(premain),也可以在 class 加載后重新加載(agentmain)。

執行過程

動手寫一個 Demo

通過 javassist,在運行時更改指定方法的代碼,在方法之前后添加自定義邏輯。

1、定義 Agent 類。當前 Java 提供了兩種方式可以將代碼代碼注入到 JVM 中,這里我們的 Demo 選擇使用 agentmain 方法來實現。

premain:在啟動時通過 javaagent 命令,將代理注入到指定的 JVM 中。
agentmain:運行時通過 attach 工具激活指定代理。

  1. /** * AgentMain * * @author tomxin */public class AgentMain { public static void agentmain(String agentArgs, Instrumentation instrumentation) throws UnmodifiableClassException, ClassNotFoundException { instrumentation.addTransformer(new InterceptorTransformer(agentArgs), true); Class clazz = Class.forName(agentArgs.split(",")[1]); instrumentation.retransformClasses(clazz); }}/** * InterceptorTransformer * * @author tomxin */public class InterceptorTransformer implements ClassFileTransformer { private String agentArgs; public InterceptorTransformer(String agentArgs) { this.agentArgs = agentArgs; } @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { //javassist的包名是用點分割的,需要轉換下 if (className != null && className.indexOf("/") != -1) { className = className.replaceAll("/", "."); } try { //通過包名獲取類文件 CtClass cc = ClassPool.getDefault().get(className); //獲得指定方法名的方法 CtMethod m = cc.getDeclaredMethod(agentArgs.split(",")[2]); //在方法執行前插入代碼 m.insertBefore("{ System.out.println(\"=========開始執行=========\"); }"); m.insertAfter("{ System.out.println(\"=========結束執行=========\"); }"); return cc.toBytecode(); } catch (Exception e) { } return null; }} 

2、使用 Maven 配置 MANIFEST.MF 文件,該文件能夠指定 Jar 包的 main 方法。

  1. <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <Agent-Class>com.tom.mdc.AgentMain</Agent-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build> 

3、定義 Attach 方法,通過 VirtualMachine.attach(#{pid}) 來指定要代理的類。

  1. import com.sun.tools.attach.VirtualMachine;import java.io.IOException;/** * AttachMain * * @author tomxin */public class AttachMain { public static void main(String[] args) { VirtualMachine virtualMachine = nulltry { virtualMachine = VirtualMachine.attach(args[0]); // 將打包好的Jar包,添加到指定的JVM進程中。 virtualMachine.loadAgent("target/agent-demo-1.0-SNAPSHOT.jar",String.join(",", args)); } catch (Exception e) { if (virtualMachine != null) { try { virtualMachine.detach(); } catch (IOException ex) { ex.printStackTrace(); } } } }} 

4、定義測試的方法

  1. package com.tom.mdc;import java.lang.management.ManagementFactory;import java.util.Random;import java.util.concurrent.TimeUnit;/** * PrintParamTarget * * @author toxmxin */public class PrintParamTarget { public static void main(String[] args) { // 打印當前進程ID System.out.println(ManagementFactory.getRuntimeMXBean().getName()); Random random = new Random(); while (true) { int sleepTime = 5 + random.nextInt(5); running(sleepTime); } } private static void running(int sleepTime) { try { TimeUnit.SECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("running sleep time " + sleepTime); }} 

 

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2024-04-30 08:09:10

PulsarArthas消息隊列

2023-03-03 09:33:45

ArthasJava診斷工具

2021-04-19 17:25:08

Kubernetes組件網絡

2025-07-18 09:31:30

2021-06-01 09:29:43

ArthasJVM內存

2020-10-28 15:07:01

Arthas

2022-05-08 09:11:44

WiFi樹莓派GO

2009-08-21 09:14:47

C# Excel CO

2024-09-10 09:31:07

開源項目Arthas

2025-05-08 08:20:00

Arthas開源Java

2010-08-04 14:28:01

Flex組件

2024-08-14 14:20:00

2020-12-07 11:12:16

MySOLBinlogOtter

2022-01-26 19:42:05

MySQL亂碼排查

2021-11-14 05:00:56

排查Sdk方式

2021-06-01 07:55:42

DockerEOFk8s

2021-12-01 15:03:56

Java開發代碼

2025-03-18 08:10:00

iodump開源I/O

2020-04-23 10:07:45

工具IDEA阿里巴巴

2024-11-22 09:40:18

Visual內存泄漏內存
點贊
收藏

51CTO技術棧公眾號

综合视频在线观看| 国产欧美va欧美va香蕉在| 在线免费看黄色片| 国产精品毛片久久久久久久久久99999999| 欧美激情一区在线| 91黄色国产视频| 国产精品久久久久久人| 亚洲国产老妈| 国产偷国产偷亚洲清高网站| 黄大色黄女片18第一次| 欧美24videosex性欧美| 国产网红主播福利一区二区| 91精品国产综合久久久久久丝袜 | 亚洲精品中文在线观看| 久久久久久久久久久久久9999| 中文字幕乱码在线观看| 在线亚洲自拍| 久久影院资源网| 国产一区二区三区精品在线| 98视频精品全部国产| 欧美性一区二区| 久久这里只有精品23| 午夜视频在线观看免费视频| 99精品桃花视频在线观看| 成人黄色免费看| 天天干天天操天天爱| 国产一区日韩欧美| 日韩最新在线视频| 久久久久久久久久久久久久久| 999在线精品| 欧美福利视频导航| 国产又大又黄又粗的视频| 不卡av免费观看| 亚洲精品日韩一| 一区二区在线观| 国产美女视频一区二区三区 | 日本理论中文字幕| 亚洲三级网页| 亚洲精品成人久久电影| 亚洲成a人片在线www| 色综合久久久| 在线成人免费观看| 激情 小说 亚洲 图片: 伦| 男人天堂视频在线观看| 午夜成人免费视频| 成年人网站国产| 国产91足控脚交在线观看| 亚洲精品久久7777| 欧美一级特黄aaaaaa在线看片| 日本精品在线| 中文字幕一区二区三区在线观看 | 黄在线免费看| 亚洲欧洲日本在线| 亚洲视频电影| 快射视频在线观看| 中文字幕一区二区三区在线播放| 亚洲激情一区二区三区| 成人免费视频| 国产精品国产馆在线真实露脸| 亚洲精品二区| 成人av福利| 一区二区三区四区精品在线视频| 成人av在线播放观看| 色呦呦久久久| 精品成人乱色一区二区| 精品人妻一区二区三区四区在线 | av一区二区在线看| 黄色一级a毛片| 不卡一区二区三区四区| 久久大香伊蕉在人线观看热2| 色吊丝在线永久观看最新版本| 久久先锋影音av| 五月天亚洲综合小说网| 乱人伦中文视频在线| 依依成人精品视频| 久久精品视频16| 欧美在线va视频| 欧美久久婷婷综合色| 欧美日韩一区二区区| 玖玖玖免费嫩草在线影院一区| 亚洲女成人图区| 正在播放国产对白害羞| 欧美人成在线| 日韩av大片在线| 国产特级aaaaaa大片| 99久久精品99国产精品| 亚洲精品日韩在线观看| 影音先锋男人在线资源| 欧美性极品少妇精品网站| 高潮一区二区三区| 精品福利网址导航| 国产亚洲精品美女久久久久| www.99re7| 亚洲专区在线| 91免费的视频在线播放| 亚洲 另类 春色 国产| 国产精品福利一区| 国产精品无码av在线播放| 青娱乐极品盛宴一区二区| 亚洲国内高清视频| 欧美视频一区二区在线| 亚洲看片一区| 91精品综合久久久久久五月天| 亚洲日本中文字幕在线| 亚洲欧美激情视频在线观看一区二区三区 | 999国产在线视频| 亚洲成人tv网| 一区二区三区四区毛片| 亚洲综合福利| 久久久女女女女999久久| 中文字幕人妻一区二区在线视频 | xxxx在线视频| 9191久久久久久久久久久| 日本免费福利视频| 欧美涩涩网站| 91精品免费看| 阿v免费在线观看| 欧美日韩日本国产| 午夜免费视频网站| 日韩电影免费网站| 青青在线视频一区二区三区| 亚洲av色香蕉一区二区三区| 国产精品美女久久久久久久久久久 | 在线视频中文字幕一区二区| 无码国产69精品久久久久网站 | 久久在线免费观看视频| 国产精品51麻豆cm传媒| 久久免费电影网| aa视频在线播放| 警花av一区二区三区| 最近2019年日本中文免费字幕| 亚洲免费黄色网址| 97久久久精品综合88久久| 欧美做暖暖视频| 欧美特黄不卡| 久久香蕉频线观| 亚洲视频在线观看免费视频| 日本一区二区三区免费乱视频| 成人免费在线小视频| 久久影视三级福利片| 久久免费福利视频| 色丁香婷婷综合久久| 亚洲成人自拍偷拍| 国产精品伦子伦| 亚洲全部视频| 精品久久久久久乱码天堂| 成人超碰在线| 亚洲精品福利在线观看| 日韩欧美三级在线观看| 9i在线看片成人免费| 久激情内射婷内射蜜桃| 欧美午夜寂寞| 日本精品中文字幕| av在线电影网| 欧美精品成人一区二区三区四区| 日韩在线一卡二卡| 国产精品自拍av| a级黄色片免费| 国产精品15p| 欧美性受xxxx白人性爽| 免费福利在线观看| 在线亚洲精品福利网址导航| 久久精品国产亚洲AV成人婷婷| 狠狠久久亚洲欧美| 欧美人与动牲交xxxxbbbb| 9l视频自拍蝌蚪9l视频成人| 91精品国产91久久久| 欧美日韩国产中文字幕在线| 欧美怡红院视频| 国产亚洲精品久久久久久豆腐| 国产主播一区二区| 免费高清一区二区三区| 色先锋久久影院av| 国产日韩欧美日韩| 香蕉成人app免费看片| 亚洲国产女人aaa毛片在线| av图片在线观看| 国产精品成人网| 97精品人人妻人人| 三级影片在线观看欧美日韩一区二区| 亚洲一区不卡在线| 中文字幕一区二区三区四区久久| 午夜精品久久久久久久久久久久 | 精品国产免费无码久久久| 亚洲成av人综合在线观看| av中文字幕免费观看| 国产一区二区三区高清播放| 男人日女人逼逼| 国产精品久久久久一区二区三区厕所 | 久久亚洲精品石原莉奈| 亚洲天堂精品在线观看| 自拍视频一区二区| 久久99精品国产.久久久久久| 91黄色在线看| 久久激情电影| 久久精品99| 国产美女视频一区二区| 欧美在线播放视频| 先锋影音在线资源站91| 国产一区二区三区在线看 | 久久精品视频5| 亚洲免费在线视频| 亚洲天堂最新地址| 不卡视频在线观看| 视频免费1区二区三区| 午夜一级在线看亚洲| 黄色特一级视频| 日韩高清欧美| 欧美xxxx黑人又粗又长精品| 视频免费一区二区| 国产日韩欧美一二三区| 不卡av影片| 国内精品一区二区三区四区| 男人天堂久久久| 亚洲天堂av在线播放| 日韩专区第一页| 日韩欧美高清在线| 一卡二卡在线观看| 在线观看亚洲精品| 精品成人久久久| 亚洲国产乱码最新视频 | 午夜欧美一区二区三区在线播放| 日本中文在线视频| 国产日韩一级二级三级| 大乳护士喂奶hd| 从欧美一区二区三区| 伊人成人免费视频| 韩国视频一区二区| 日韩一区二区三区不卡视频| 日韩 欧美一区二区三区| jizzjizzxxxx| 美日韩精品视频| 日韩小视频在线播放| 精品成人免费| 国产综合中文字幕| 极品尤物久久久av免费看| 8x8ⅹ国产精品一区二区二区| 亚洲国产精品成人| 好吊色这里只有精品| 99久久.com| 国产麻豆电影在线观看| 在线精品小视频| 国产91av视频在线观看| 国产精品久久占久久| 好吊色这里只有精品| 欧美日韩p片| 久久久久久久9| 亚洲国产专区校园欧美| 日本手机在线视频| 日韩一区二区久久| 国产中文字幕免费观看| 久久蜜桃精品| 成年人在线观看视频免费| 日本视频一区二区| 色91精品久久久久久久久| 国内精品视频一区二区三区八戒| 欧美一级小视频| 国产不卡在线视频| 日韩aaaaa| 久久精品一区二区三区av| 四虎国产精品成人免费入口| 国产精品乱人伦中文| 国产美女福利视频| 一区二区三区 在线观看视频| 国产精品第108页| 欧美色欧美亚洲高清在线视频| 无码人妻丰满熟妇精品| 欧美午夜不卡视频| 国产视频在线观看视频| 亚洲国产欧美在线成人app| 日本精品一二区| 一区二区三区国产在线观看| 麻豆免费在线视频| 久久久在线观看| 亚洲精品555| 91精品国产一区二区三区动漫| 欧美理论电影在线精品| 少妇精品久久久久久久久久| 女人香蕉久久**毛片精品| 免费看一级大黄情大片| 日本午夜精品视频在线观看| 少妇欧美激情一区二区三区| 99久久精品国产观看| 免费看一级黄色| 亚洲一区二区三区影院| 中文字幕天堂在线| 欧美va亚洲va在线观看蝴蝶网| 欧美男男激情freegay| 久久婷婷国产麻豆91天堂| 欧美裸体视频| 亚洲a中文字幕| 亚洲人成网www| 久久久国内精品| 日韩高清电影一区| 稀缺小u女呦精品呦| 欧美激情一区在线| 日韩欧美亚洲一区二区三区| 欧美人狂配大交3d怪物一区| 少妇喷水在线观看| 在线丨暗呦小u女国产精品| 欧美xxx黑人xxx水蜜桃| 国产成人精品日本亚洲| 精品国模一区二区三区欧美 | 欧洲亚洲精品在线| 性欧美videos另类hd| 亚洲一级免费视频| 九九色在线视频| 成人疯狂猛交xxx| 国产精品手机在线播放| 国产天堂视频在线观看| 紧缚捆绑精品一区二区| 日韩人妻无码精品综合区| 午夜欧美在线一二页| www.久久久久久久久久| 中文字幕国产精品| 亚洲日本天堂| 国产精品有限公司| 欧美日韩天堂| 特级黄色片视频| 国产精品免费网站在线观看| 无码人妻丰满熟妇区五十路| 亚洲精品国产综合久久| 色av手机在线| 91日韩在线播放| 日韩精品网站| 午夜免费精品视频| 久久久国产一区二区三区四区小说| 日韩精品一卡二卡| 精品国产欧美一区二区| 色呦呦在线资源| 成人av蜜桃| 国模吧视频一区| 日本wwwwwww| 玉足女爽爽91| 成人毛片在线免费观看| 九九热这里只有精品6| 国产免费av国片精品草莓男男| 中文字幕中文字幕在线中一区高清 | 精品国产乱码久久久久久果冻传媒 | 亚洲欧美综合另类| 亚洲男人的天堂在线播放| caoprom在线| 精品一区二区三区国产| 国产亚洲毛片在线| mm131美女视频| 欧美性色视频在线| 国产日产精品久久久久久婷婷| 国产精品手机播放| 亚洲蜜桃视频| 在线中文字日产幕| 天天操天天色综合| 麻豆导航在线观看| 国产精品美女主播| 99精品美女| 久久久无码人妻精品无码| 亚洲午夜电影网| 少妇激情av一区二区| 国产精品jizz在线观看麻豆| 青青草原综合久久大伊人精品| 超碰成人在线播放| 一区二区不卡在线播放| 五月婷婷丁香网| 国产精品久久不能| 久久久久久久久99精品大| www日本在线观看| 精品久久久久久久久久| 国产私拍精品| 亚洲一区二区三区sesese| 欧美日韩亚洲一区三区 | 欧美色网址大全| 中文字幕线观看| 亚洲国产成人91porn| 日本免费一区二区三区最新| 国产精品中文久久久久久久| 亚洲h色精品| 一级国产黄色片| 欧美三级韩国三级日本一级| 在线观看操人| 蜜桃久久精品乱码一区二区| 精品一区二区三区在线观看国产| 欧美成人aaa片一区国产精品| 亚洲国产小视频| 91麻豆精品| 欧美视频在线播放一区| 中文字幕一区二区三区不卡在线 | 麻豆精品一区| 动漫av网站免费观看| 综合电影一区二区三区 | 久久久久久久久免费| 国产精品一区二区av白丝下载 | 99精品视频在线免费观看| 国产精品欧美综合| 欧美精品国产精品日韩精品| 欧美最新另类人妖| 日本一区二区免费视频| 欧美日韩在线不卡| 欧美巨大丰满猛性社交| 激情视频小说图片| 国产视频一区不卡| 免费观看黄色av|